X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fraw_socket.cxx;h=d972c14531e4f5b292600cf0519bd901818ee0d8;hb=c7152af1917c1388fe3a944e7481a271cce797ba;hp=7fe2c6884cb61ca49dd07915a74a7bcce7e93bc2;hpb=b7654c181dc8d52875365b170bc3092e8e51d68f;p=simgear.git diff --git a/simgear/io/raw_socket.cxx b/simgear/io/raw_socket.cxx index 7fe2c688..d972c145 100644 --- a/simgear/io/raw_socket.cxx +++ b/simgear/io/raw_socket.cxx @@ -39,7 +39,8 @@ #include #if defined(WINSOCK) -# include +# include +# include # include #else # include @@ -114,17 +115,33 @@ void IPAddress::set ( const char* host, int port ) return; } - struct addrinfo* result = NULL; - int err = getaddrinfo(host, NULL, NULL /* no hints */, &result); + struct addrinfo hints; + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET; + + struct addrinfo* result0 = NULL; + int err = getaddrinfo(host, NULL, &hints, &result0); if (err) { SG_LOG(SG_IO, SG_WARN, "getaddrinfo failed for '" << host << "' : " << gai_strerror(err)); - } else if (result->ai_addrlen != getAddrLen()) { - SG_LOG(SG_IO, SG_ALERT, "mismatch in socket address sizes"); } else { - memcpy(addr, result->ai_addr, result->ai_addrlen); - } - - freeaddrinfo(result); + struct addrinfo* result; + for (result = result0; result != NULL; result = result->ai_next) { + if (result->ai_family != AF_INET) { // only accept IP4 for the moment + continue; + } + + if (result->ai_addrlen != getAddrLen()) { + SG_LOG(SG_IO, SG_ALERT, "mismatch in socket address sizes: got " << + result->ai_addrlen << ", expected " << getAddrLen()); + continue; + } + + memcpy(addr, result->ai_addr, result->ai_addrlen); + break; + } // of getaddrinfo results iteration + } // of getaddrinfo succeeded + + freeaddrinfo(result0); addr->sin_port = htons (port); // fix up port after getaddrinfo } @@ -328,7 +345,7 @@ int Socket::bind ( const char* host, int port ) } } #if defined(WINSOCK) - else if( (result = ::bind(handle,addr->getAddr(), addr->getAddrLen())) < 0 ) { + else if( (result = ::bind(handle,addr.getAddr(), addr.getAddrLen())) < 0 ) { SG_LOG(SG_IO, SG_ALERT, "bind(" << host << ":" << port << ") failed. Errno " << errno << " (" << strerror(errno) << ")"); return result; }