diff options
Diffstat (limited to 'unix.c')
-rw-r--r-- | unix.c | 63 |
1 files changed, 40 insertions, 23 deletions
@@ -152,37 +152,39 @@ enet_address_get_host (const ENetAddress * address, char * name, size_t nameLeng return 0; } -ENetSocket -enet_socket_create (ENetSocketType type, const ENetAddress * address) +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) { - ENetSocket newSocket = socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); struct sockaddr_in sin; - if (newSocket == ENET_SOCKET_NULL) - return ENET_SOCKET_NULL; - - if (address == NULL) - return newSocket; - memset (& sin, 0, sizeof (struct sockaddr_in)); - sin.sin_family = AF_INET; - sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); - sin.sin_addr.s_addr = address -> host; - - if (bind (newSocket, - (struct sockaddr *) & sin, - sizeof (struct sockaddr_in)) == -1 || - (type == ENET_SOCKET_TYPE_STREAM && - address -> port != ENET_PORT_ANY && - listen (newSocket, SOMAXCONN) == -1)) + if (address != NULL) { - close (newSocket); - - return ENET_SOCKET_NULL; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; } - return newSocket; + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)); +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog); +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); } int @@ -203,6 +205,10 @@ enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); break; + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + case ENET_SOCKOPT_RCVBUF: result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); break; @@ -346,6 +352,17 @@ enet_socket_receive (ENetSocket socket, } int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) { #ifdef HAS_POLL |