Made UDP socket binding more robust.
This commit is contained in:
parent
8e94528d6f
commit
be3a852fb0
1 changed files with 6 additions and 7 deletions
|
@ -1136,28 +1136,27 @@ void Socket::UDPConnection::SendNow(const char * sdata, size_t len) {
|
||||||
/// \return Actually bound port number, or zero on error.
|
/// \return Actually bound port number, or zero on error.
|
||||||
int Socket::UDPConnection::bind(int port) {
|
int Socket::UDPConnection::bind(int port) {
|
||||||
struct sockaddr_in6 s6;
|
struct sockaddr_in6 s6;
|
||||||
|
memset(&s6, 0, sizeof(s6));
|
||||||
s6.sin6_family = AF_INET6;
|
s6.sin6_family = AF_INET6;
|
||||||
s6.sin6_addr = in6addr_any;
|
s6.sin6_addr = in6addr_any;
|
||||||
if (port) {
|
|
||||||
s6.sin6_port = htons(port);
|
s6.sin6_port = htons(port);
|
||||||
}
|
|
||||||
int r = ::bind(sock, (sockaddr *)&s6, sizeof(s6));
|
int r = ::bind(sock, (sockaddr *)&s6, sizeof(s6));
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
return ntohs(s6.sin6_port);
|
return ntohs(s6.sin6_port);
|
||||||
}
|
}
|
||||||
|
unsigned int ipv6_errno = errno;
|
||||||
|
|
||||||
struct sockaddr_in s4;
|
struct sockaddr_in s4;
|
||||||
|
memset(&s4, 0, sizeof(s4));
|
||||||
s4.sin_family = AF_INET;
|
s4.sin_family = AF_INET;
|
||||||
s4.sin_addr.s_addr = INADDR_ANY;
|
s4.sin_addr.s_addr = INADDR_ANY;
|
||||||
if (port) {
|
|
||||||
s4.sin_port = htons(port);
|
s4.sin_port = htons(port);
|
||||||
}
|
|
||||||
r = ::bind(sock, (sockaddr *)&s4, sizeof(s4));
|
r = ::bind(sock, (sockaddr *)&s4, sizeof(s4));
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
return ntohs(s4.sin_port);
|
return ntohs(s4.sin_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_MSG(DLVL_FAIL, "Could not bind UDP socket to port %d: %s", port, strerror(errno));
|
DEBUG_MSG(DLVL_FAIL, "Could not bind UDP socket to port %d: IPv6: %s, IPv4: %s", port, strerror(ipv6_errno), strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue