From 726ff6bc6d0f596b8ff067f5ac10708d385767d3 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Wed, 20 Mar 2013 00:43:34 +0200 Subject: [PATCH] query the socket name if an explicit address binding is requested on host creation --- host.c | 2 +- include/enet/enet.h | 1 + unix.c | 15 +++++++++++++++ win32.c | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/host.c b/host.c index d0ee595..92fe1b6 100644 --- a/host.c +++ b/host.c @@ -66,7 +66,7 @@ enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelL enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE); enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE); - if (address != NULL) + if (address != NULL && enet_socket_get_address (host -> socket, & host -> address) < 0) host -> address = * address; if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) diff --git a/include/enet/enet.h b/include/enet/enet.h index 5f9d540..c0e6025 100644 --- a/include/enet/enet.h +++ b/include/enet/enet.h @@ -471,6 +471,7 @@ ENET_API void enet_time_set (enet_uint32); */ ENET_API ENetSocket enet_socket_create (ENetSocketType); ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *); ENET_API int enet_socket_listen (ENetSocket, int); ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *); ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *); diff --git a/unix.c b/unix.c index d425b4b..fe8a280 100644 --- a/unix.c +++ b/unix.c @@ -194,6 +194,21 @@ enet_socket_bind (ENetSocket socket, const ENetAddress * address) sizeof (struct sockaddr_in)); } +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + int enet_socket_listen (ENetSocket socket, int backlog) { diff --git a/win32.c b/win32.c index dcc0791..99bdaaa 100644 --- a/win32.c +++ b/win32.c @@ -125,6 +125,21 @@ enet_socket_bind (ENetSocket socket, const ENetAddress * address) sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0; } +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + int enet_socket_listen (ENetSocket socket, int backlog) {