Browse Source

Handle port==0 when socket is bound on ipv6

I discovered
https://github.com/yhirose/cpp-httplib/commit/0515c6aad6834a2a329db226b9312294d0002a13
doesn't work when the server is bound on an AF_INET6 address on Windows
due to the getsockname() call failing.
Scott Graham 7 years ago
parent
commit
f275352cba
1 changed files with 10 additions and 4 deletions
  1. 10 4
      httplib.h

+ 10 - 4
httplib.h

@@ -1626,12 +1626,18 @@ inline int Server::bind_internal(const char* host, int port, int socket_flags)
     }
 
     if (port == 0) {
-        struct sockaddr_in sin;
-        socklen_t len = sizeof(sin);
-        if (getsockname(svr_sock_, reinterpret_cast<struct sockaddr *>(&sin), &len) == -1) {
+        struct sockaddr_storage address;
+        socklen_t len = sizeof(address);
+        if (getsockname(svr_sock_, reinterpret_cast<struct sockaddr *>(&address), &len) == -1) {
             return -1;
         }
-        return ntohs(sin.sin_port);
+        if (address.ss_family == AF_INET) {
+          return ntohs(reinterpret_cast<struct sockaddr_in*>(&address)->sin_port);
+        } else if (address.ss_family == AF_INET6) {
+          return ntohs(reinterpret_cast<struct sockaddr_in6*>(&address)->sin6_port);
+        } else {
+          return -1;
+        }
     } else {
         return port;
     }