aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/enet/enet.h10
-rw-r--r--protocol.c8
-rw-r--r--unix.c4
-rw-r--r--win32.c6
4 files changed, 20 insertions, 8 deletions
diff --git a/include/enet/enet.h b/include/enet/enet.h
index b855018..6ed12af 100644
--- a/include/enet/enet.h
+++ b/include/enet/enet.h
@@ -44,7 +44,8 @@ typedef enum
enum
{
- ENET_HOST_ANY = 0
+ ENET_HOST_ANY = 0, /**< specifies the default server host */
+ ENET_HOST_BROADCAST = 0xFFFFFFFF /**< specifies a subnet-wide broadcast */
};
/**
@@ -52,11 +53,14 @@ enum
*
* The host must be specified in network byte-order, and the port must be in host
* byte-order. The constant ENET_HOST_ANY may be used to specify the default
- * server host.
+ * server host. The constant ENET_HOST_BROADCAST may be used to specify the
+ * broadcast address (255.255.255.255). This makes sense for enet_host_connect,
+ * but not for enet_host_create. Once a server responds to a broadcast, the
+ * address is updated from ENET_HOST_BROADCAST to the server's actual IP address.
*/
typedef struct _ENetAddress
{
- enet_uint32 host; /**< may use ENET_HOST_ANY to specify default server host */
+ enet_uint32 host;
enet_uint16 port;
} ENetAddress;
diff --git a/protocol.c b/protocol.c
index d0014f0..ef8935b 100644
--- a/protocol.c
+++ b/protocol.c
@@ -643,11 +643,15 @@ enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event)
if (peer -> state == ENET_PEER_STATE_DISCONNECTED ||
peer -> state == ENET_PEER_STATE_ZOMBIE ||
- host -> receivedAddress.host != peer -> address.host ||
+ (host -> receivedAddress.host != peer -> address.host &&
+ peer -> address.host != ENET_HOST_BROADCAST) ||
header -> challenge != peer -> challenge)
return 0;
else
- peer -> address.port = host -> receivedAddress.port;
+ {
+ peer -> address.host = host -> receivedAddress.host;
+ peer -> address.port = host -> receivedAddress.port;
+ }
}
if (peer != NULL)
diff --git a/unix.c b/unix.c
index b84d34b..c6eb823 100644
--- a/unix.c
+++ b/unix.c
@@ -128,7 +128,8 @@ ENetSocket
enet_socket_create (ENetSocketType type, const ENetAddress * address)
{
ENetSocket newSocket = socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
- int receiveBufferSize = ENET_HOST_RECEIVE_BUFFER_SIZE;
+ int receiveBufferSize = ENET_HOST_RECEIVE_BUFFER_SIZE,
+ allowBroadcasting = 1;
#ifndef HAS_FCNTL
int nonBlocking = 1;
#endif
@@ -146,6 +147,7 @@ enet_socket_create (ENetSocketType type, const ENetAddress * address)
#endif
setsockopt (newSocket, SOL_SOCKET, SO_RCVBUF, (char *) & receiveBufferSize, sizeof (int));
+ setsockopt (newSocket, SOL_SOCKET, SO_BROADCAST, (char *) & allowBroadcasting, sizeof (int));
}
if (address == NULL)
diff --git a/win32.c b/win32.c
index c5c1959..b2ff017 100644
--- a/win32.c
+++ b/win32.c
@@ -88,8 +88,9 @@ ENetSocket
enet_socket_create (ENetSocketType type, const ENetAddress * address)
{
ENetSocket newSocket = socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
- u_long nonBlocking = 1,
- receiveBufferSize = ENET_HOST_RECEIVE_BUFFER_SIZE;
+ u_long nonBlocking = 1;
+ int receiveBufferSize = ENET_HOST_RECEIVE_BUFFER_SIZE,
+ allowBroadcasting = 1;
struct sockaddr_in sin;
if (newSocket == ENET_SOCKET_NULL)
@@ -100,6 +101,7 @@ enet_socket_create (ENetSocketType type, const ENetAddress * address)
ioctlsocket (newSocket, FIONBIO, & nonBlocking);
setsockopt (newSocket, SOL_SOCKET, SO_RCVBUF, (char *) & receiveBufferSize, sizeof (int));
+ setsockopt (newSocket, SOL_SOCKET, SO_BROADCAST, (char *) & allowBroadcasting, sizeof (int));
}
memset (& sin, 0, sizeof (struct sockaddr_in));