Browse Source

Improve obtainment of an address from a socket

Stas Denisov 6 years ago
parent
commit
5ae6bfb86c
1 changed files with 35 additions and 11 deletions
  1. 35 11
      Source/Native/enet.h

+ 35 - 11
Source/Native/enet.h

@@ -31,7 +31,7 @@
 
 
 #define ENET_VERSION_MAJOR 2
 #define ENET_VERSION_MAJOR 2
 #define ENET_VERSION_MINOR 3
 #define ENET_VERSION_MINOR 3
-#define ENET_VERSION_PATCH 2
+#define ENET_VERSION_PATCH 3
 #define ENET_VERSION_CREATE(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch))
 #define ENET_VERSION_CREATE(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch))
 #define ENET_VERSION_GET_MAJOR(version) (((version) >> 16) & 0xFF)
 #define ENET_VERSION_GET_MAJOR(version) (((version) >> 16) & 0xFF)
 #define ENET_VERSION_GET_MINOR(version) (((version) >> 8) & 0xFF)
 #define ENET_VERSION_GET_MINOR(version) (((version) >> 8) & 0xFF)
@@ -4460,14 +4460,26 @@ extern "C" {
 		}
 		}
 
 
 		int enet_socket_get_address(ENetSocket socket, ENetAddress* address) {
 		int enet_socket_get_address(ENetSocket socket, ENetAddress* address) {
-			struct sockaddr_in6 sin;
-			socklen_t sinLength = sizeof(struct sockaddr_in6);
+			struct sockaddr_storage sa;
+			socklen_t saLength = sizeof(sa);
 
 
-			if (getsockname(socket, (struct sockaddr*)&sin, &sinLength) == -1)
+			if (getsockname(socket, (struct sockaddr*)&sa, &saLength) == -1)
 				return -1;
 				return -1;
 
 
-			address->ipv6 = sin.sin6_addr;
-			address->port = ENET_NET_TO_HOST_16(sin.sin6_port);
+			if (sa.ss_family == AF_INET) {
+				struct sockaddr_in* sin = (struct sockaddr_in*)&sa;
+
+				memset(address, 0, sizeof(address->ipv4.zeros));
+
+				address->ipv4.ffff = 0xFFFF;
+				address->ipv4.ip = sin->sin_addr;
+				address->port = ENET_NET_TO_HOST_16(sin->sin_port);
+			} else if (sa.ss_family == AF_INET6) {
+				struct sockaddr_in6* sin = (struct sockaddr_in6*)&sa;
+
+				address->ipv6 = sin->sin6_addr;
+				address->port = ENET_NET_TO_HOST_16(sin->sin6_port);
+			}
 
 
 			return 0;
 			return 0;
 		}
 		}
@@ -4784,14 +4796,26 @@ extern "C" {
 		}
 		}
 
 
 		int enet_socket_get_address(ENetSocket socket, ENetAddress* address) {
 		int enet_socket_get_address(ENetSocket socket, ENetAddress* address) {
-			struct sockaddr_in6 sin;
-			int sinLength = sizeof(struct sockaddr_in6);
+			struct sockaddr_storage sa;
+			int saLength = sizeof(sa);
 
 
-			if (getsockname(socket, (struct sockaddr*)&sin, &sinLength) == -1)
+			if (getsockname(socket, (struct sockaddr*)&sa, &saLength) == -1)
 				return -1;
 				return -1;
 
 
-			address->ipv6 = sin.sin6_addr;
-			address->port = ENET_NET_TO_HOST_16(sin.sin6_port);
+			if (sa.ss_family == AF_INET) {
+				struct sockaddr_in* sin = (struct sockaddr_in*)&sa;
+
+				memset(address, 0, sizeof(address->ipv4.zeros));
+
+				address->ipv4.ffff = 0xFFFF;
+				address->ipv4.ip = sin->sin_addr;
+				address->port = ENET_NET_TO_HOST_16(sin->sin_port);
+			} else if (sa.ss_family == AF_INET6) {
+				struct sockaddr_in6* sin = (struct sockaddr_in6*)&sa;
+
+				address->ipv6 = sin->sin6_addr;
+				address->port = ENET_NET_TO_HOST_16(sin->sin6_port);
+			}
 
 
 			return 0;
 			return 0;
 		}
 		}