diff -r 5b0aeef8ba2a -r 5608ac657362 project_files/frontlib/socket.c --- a/project_files/frontlib/socket.c Thu Jun 21 21:32:12 2012 +0200 +++ b/project_files/frontlib/socket.c Mon Jun 25 00:42:07 2012 +0200 @@ -5,84 +5,77 @@ #include #include -typedef struct _flib_tcpsocket { +struct _flib_tcpsocket { TCPsocket sock; SDLNet_SocketSet sockset; -} _flib_tcpsocket; +}; -typedef struct _flib_acceptor { +struct _flib_acceptor { TCPsocket sock; uint16_t port; -} _flib_acceptor; +}; -static uint32_t get_peer_ip(TCPsocket sock) { +static uint32_t getPeerIp(TCPsocket sock) { IPaddress *addr = SDLNet_TCP_GetPeerAddress(sock); return SDLNet_Read32(&addr->host); } -static bool connection_is_local(TCPsocket sock) { - return get_peer_ip(sock) == (uint32_t)((127UL<<24)+1); // 127.0.0.1 +static bool connectionIsLocal(TCPsocket sock) { + return getPeerIp(sock) == (uint32_t)((127UL<<24)+1); // 127.0.0.1 } -static flib_tcpsocket *flib_socket_create(TCPsocket sdlsock) { - flib_tcpsocket *result = flib_calloc(1, sizeof(_flib_tcpsocket)); - if(!result) { - return NULL; - } - result->sock = sdlsock; - result->sockset = SDLNet_AllocSocketSet(1); +static flib_tcpsocket *createSocket(TCPsocket sdlsock) { + flib_tcpsocket *result = flib_calloc(1, sizeof(flib_tcpsocket)); + if(result) { + result->sock = sdlsock; + result->sockset = SDLNet_AllocSocketSet(1); - if(!result->sockset) { - flib_log_e("Can't allocate socket: Out of memory!"); - SDLNet_FreeSocketSet(result->sockset); - free(result); - return NULL; + if(!result->sockset) { + flib_log_e("Can't allocate socket: Out of memory!"); + SDLNet_FreeSocketSet(result->sockset); + free(result); + result = NULL; + } else { + SDLNet_AddSocket(result->sockset, (SDLNet_GenericSocket)result->sock); + } } + return result; +} - SDLNet_AddSocket(result->sockset, (SDLNet_GenericSocket)result->sock); - return result; +TCPsocket listen(uint16_t port) { + IPaddress addr; + addr.host = INADDR_ANY; + SDLNet_Write16(port, &addr.port); + TCPsocket sock = SDLNet_TCP_Open(&addr); + if(!sock) { + flib_log_w("Unable to listen on port %u: %s", (unsigned)port, SDLNet_GetError()); + } + return sock; } flib_acceptor *flib_acceptor_create(uint16_t port) { - flib_acceptor *result = flib_calloc(1, sizeof(_flib_acceptor)); - if(!result) { - return NULL; - } - - IPaddress addr; - addr.host = INADDR_ANY; - - if(port > 0) { - result->port = port; - SDLNet_Write16(port, &addr.port); - result->sock = SDLNet_TCP_Open(&addr); - if(result->sock) { - return result; + flib_acceptor *result = flib_calloc(1, sizeof(flib_acceptor)); + if(result) { + if(port > 0) { + result->port = port; + result->sock = listen(result->port); } else { - flib_log_e("Unable to listen on port %u: %s", (unsigned)port, SDLNet_GetError()); - free(result); - return NULL; - } - } else { - /* SDL_net does not seem to have a way to listen on a random unused port - and find out which port that is, so let's try to find one ourselves. */ - srand(time(NULL)); - rand(); - for(int i=0; i<1000; i++) { - // IANA suggests using ports in the range 49152-65535 for things like this - result->port = 49152+(rand()%(65535-49152)); - SDLNet_Write16(result->port, &addr.port); - result->sock = SDLNet_TCP_Open(&addr); - if(result->sock) { - return result; - } else { - flib_log_w("Unable to listen on port %u: %s", (unsigned)result->port, SDLNet_GetError()); + /* SDL_net does not seem to have a way to listen on a random unused port + and find out which port that is, so let's try to find one ourselves. */ + srand(time(NULL)); + for(int i=0; !result->sock && i<1000; i++) { + // IANA suggests using ports in the range 49152-65535 for things like this + result->port = 49152+(rand()%(65535-49152)); + result->sock = listen(result->port); } } - flib_log_e("Unable to listen on a random unused port."); - free(result); - return NULL; + if(!result->sock) { + flib_log_e("Failed to create acceptor."); + free(result); + result = NULL; + } } + return result; } uint16_t flib_acceptor_listenport(flib_acceptor *acceptor) { @@ -101,18 +94,17 @@ } flib_tcpsocket *flib_socket_accept(flib_acceptor *acceptor, bool localOnly) { + flib_tcpsocket *result = NULL; if(!acceptor) { flib_log_e("Call to flib_socket_accept with acceptor==null"); - return NULL; - } - flib_tcpsocket *result = NULL; - TCPsocket sock = NULL; - while(!result && (sock = SDLNet_TCP_Accept(acceptor->sock))) { - if(localOnly && !connection_is_local(sock)) { - flib_log_i("Rejected nonlocal connection attempt from %s", flib_format_ip(get_peer_ip(sock))); - SDLNet_TCP_Close(sock); - } else { - result = flib_socket_create(sock); + } else { + TCPsocket sock = NULL; + while(!result && (sock = SDLNet_TCP_Accept(acceptor->sock))) { + if(localOnly && !connectionIsLocal(sock)) { + flib_log_i("Rejected nonlocal connection attempt from %s", flib_format_ip(getPeerIp(sock))); + } else { + result = createSocket(sock); + } if(!result) { SDLNet_TCP_Close(sock); } @@ -134,7 +126,7 @@ if(!sock) { flib_log_e("SDLNet_TCP_Open: %s\n", SDLNet_GetError()); } else { - result = flib_socket_create(sock); + result = createSocket(sock); if(result) { sock = NULL; }