static void * np_socksrv_listenproc(void *a) { int csock; Npsrv *srv; Socksrv *ss; struct sockaddr_in caddr; socklen_t caddrlen; Npconn *conn; Nptrans *trans; char buf[64]; unsigned char *ip; srv = a; ss = srv->srvaux; if (listen(ss->sock, 1) < 0) return NULL; while (!ss->shutdown) { caddrlen = sizeof(caddr); csock = accept(ss->sock, (struct sockaddr *) &caddr, &caddrlen); if (csock<0) { if (!ss->shutdown) continue; close(ss->sock); if (np_socksrv_connect(ss) < 0) { fprintf(stderr, "error while reconnecting: %d\n", errno); sleep(5); } continue; } trans = np_fdtrans_create_tcp(csock, csock); conn = np_conn_create(srv, trans); ip = (char *) &caddr.sin_addr; snprintf(buf, sizeof(buf), "%u.%u.%u.%u!%d", ip[0], ip[1], ip[2], ip[3], ntohs(caddr.sin_port)); conn->address = strdup(buf); } return NULL; }
Npsrv* np_socksrv_create_tcp(int nwthreads, int *port) { socklen_t n; Npsrv *srv; Socksrv *ss; struct sockaddr_in* saddr; ss = np_socksrv_create_common(PF_INET, SOCK_STREAM, 0); saddr = malloc(sizeof(*saddr)); ss->saddr = (struct sockaddr *) saddr; ss->saddrlen = sizeof(*saddr); saddr->sin_family = AF_INET; saddr->sin_port = htons(*port); saddr->sin_addr.s_addr = htonl(INADDR_ANY); if (np_socksrv_connect(ss) < 0) { free(saddr); free(ss); return NULL; } saddr->sin_port = 4242; n = sizeof(*saddr); if (getsockname(ss->sock, ss->saddr, &n) < 0) { np_uerror(errno); free(saddr); free(ss); return NULL; } *port = ntohs(saddr->sin_port); srv = np_srv_create(nwthreads); srv->srvaux = ss; srv->start = np_socksrv_start; srv->shutdown = np_socksrv_shutdown; srv->destroy = np_socksrv_destroy; return srv; }
static void * np_socksrv_listenproc(void *a) { int csock; Npsrv *srv; Socksrv *ss; struct sockaddr_in caddr; socklen_t caddrlen; Npconn *conn; Nptrans *trans; srv = a; ss = srv->srvaux; if (listen(ss->sock, 1) < 0) return NULL; while (!ss->shutdown) { caddrlen = sizeof(caddr); csock = accept(ss->sock, (struct sockaddr *) &caddr, &caddrlen); if (csock<0) { if (!ss->shutdown) continue; close(ss->sock); if (np_socksrv_connect(ss) < 0) { fprintf(stderr, "error while reconnecting: %d\n", errno); sleep(5); } continue; } trans = np_fdtrans_create(csock, csock); conn = np_conn_create(srv, trans); } return NULL; }