示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}