/* connection_type is either SOCKET_PORT or SOCKET_MAINTENANCE_PORT, so we keep track of what state to send clients into. */ void AcceptSocketConnections(int socket_port,int connection_type) { SOCKET sock; SOCKADDR_IN sin; struct linger xlinger; int xxx; sock = socket(AF_INET,SOCK_STREAM,0); if (sock == INVALID_SOCKET) { eprintf("AcceptSocketConnections socket() failed WinSock code %i\n", GetLastError()); closesocket(sock); return; } /* Set a couple socket options for niceness */ xlinger.l_onoff=0; if (setsockopt(sock,SOL_SOCKET,SO_LINGER,(char *)&xlinger,sizeof(xlinger)) < 0) { eprintf("AcceptSocketConnections error setting sock opts 1\n"); return; } xxx=1; if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&xxx,sizeof xxx) < 0) { eprintf("AcceptSocketConnections error setting sock opts 2\n"); return; } if (!ConfigBool(SOCKET_NAGLE)) { /* turn off Nagle algorithm--improve latency? */ xxx = TRUE; if (setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&xxx,sizeof xxx)) { eprintf("AcceptSocketConnections error setting sock opts 3\n"); return; } } memset(&sin,sizeof sin,0); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons((short)socket_port); if (bind(sock,(struct sockaddr *) &sin,sizeof(sin)) == SOCKET_ERROR) { eprintf("AcceptSocketConnections bind failed, WinSock error %i\n", GetLastError()); closesocket(sock); return; } if (listen(sock,5) < 0) /* backlog of 5 connects by OS */ { eprintf("AcceptSocketConnections listen failed, WinSock error %i\n", GetLastError()); closesocket(sock); return; } StartAsyncSocketAccept(sock,connection_type); /* when we get a connection, it'll call AsyncSocketAccept */ }
/* connection_type is either SOCKET_PORT or SOCKET_MAINTENANCE_PORT, so we keep track of what state to send clients into. */ void AcceptSocketConnections(int socket_port,int connection_type) { SOCKET sock; SOCKADDR_IN6 sin; struct linger xlinger; int xxx; sock = socket(AF_INET6,SOCK_STREAM,0); if (sock == INVALID_SOCKET) { eprintf("AcceptSocketConnections socket() failed WinSock code %i\n", GetLastError()); closesocket(sock); return; } /* Make sure this is a IPv4/IPv6 dual stack enabled socket */ xxx = 0; if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&xxx, sizeof(xxx)) < 0) { eprintf("AcceptSocketConnections error setting sock opts: IPV6_V6ONLY\n"); return; } /* Set a couple socket options for niceness */ xlinger.l_onoff=0; if (setsockopt(sock,SOL_SOCKET,SO_LINGER,(char *)&xlinger,sizeof(xlinger)) < 0) { eprintf("AcceptSocketConnections error setting sock opts: SO_LINGER\n"); return; } xxx=1; if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&xxx,sizeof xxx) < 0) { eprintf("AcceptSocketConnections error setting sock opts: SO_REUSEADDR\n"); return; } if (!ConfigBool(SOCKET_NAGLE)) { /* turn off Nagle algorithm--improve latency? */ xxx = true; if (setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&xxx,sizeof xxx)) { eprintf("AcceptSocketConnections error setting sock opts: TCP_NODELAY\n"); return; } } memset(&sin,sizeof sin,0); sin.sin6_family = AF_INET6; sin.sin6_addr = in6addr_any; sin.sin6_flowinfo = 0; sin.sin6_scope_id = 0; sin.sin6_port = htons((short)socket_port); if (bind(sock,(struct sockaddr *) &sin,sizeof(sin)) == SOCKET_ERROR) { eprintf("AcceptSocketConnections bind failed, WinSock error %i\n", GetLastError()); closesocket(sock); return; } if (listen(sock,5) < 0) /* backlog of 5 connects by OS */ { eprintf("AcceptSocketConnections listen failed, WinSock error %i\n", GetLastError()); closesocket(sock); return; } StartAsyncSocketAccept(sock,connection_type); /* when we get a connection, it'll call AsyncSocketAccept */ }