summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLee Salzman <[email protected]>2013-03-20 00:43:34 +0200
committerLee Salzman <[email protected]>2013-03-20 00:43:34 +0200
commit726ff6bc6d0f596b8ff067f5ac10708d385767d3 (patch)
treeac1513268123d886149a40ff568f9443c424c173
parenteb7126c66225d04aff084e19274e15a43db884d4 (diff)
downloadenet-726ff6bc6d0f596b8ff067f5ac10708d385767d3.tar.gz
enet-726ff6bc6d0f596b8ff067f5ac10708d385767d3.zip
query the socket name if an explicit address binding is requested on host creation
-rw-r--r--host.c2
-rw-r--r--include/enet/enet.h1
-rw-r--r--unix.c15
-rw-r--r--win32.c15
4 files changed, 32 insertions, 1 deletions
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
@@ -126,6 +126,21 @@ enet_socket_bind (ENetSocket socket, const ENetAddress * address)
}
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)
{
return listen (socket, backlog < 0 ? SOMAXCONN : backlog) == SOCKET_ERROR ? -1 : 0;