From: Guus Sliepen Date: Fri, 28 Feb 2020 18:25:52 +0000 (+0100) Subject: Further improve try_bind(). X-Git-Url: http://git.meshlink.io/?p=meshlink;a=commitdiff_plain;h=1ab9403c5eb08bcb47e8e1599764b5465c79795b Further improve try_bind(). Make try_bind() do the same checks as add_listen_address() does: try to create both a TCP and UDP socket on a given port for all address families. If one address family succeeds for both TCP and UDP, consider this a valid port. --- diff --git a/src/meshlink.c b/src/meshlink.c index 6fd89dad..4e32761f 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -540,25 +540,33 @@ static bool try_bind(int port) { bool success = false; for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { - if(!(aip->ai_family == AF_INET || aip->ai_family == AF_INET6)) { + int tcp_fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP); + + if(tcp_fd == -1) { continue; } - int fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP); + int result = bind(tcp_fd, aip->ai_addr, aip->ai_addrlen); + closesocket(tcp_fd); - if(fd == -1) { - success = false; - break; + if(result) { + continue; } - int result = bind(fd, aip->ai_addr, aip->ai_addrlen); - closesocket(fd); + int udp_fd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP); + + if(udp_fd == -1) { + continue; + } + + result = bind(udp_fd, aip->ai_addr, aip->ai_addrlen); + closesocket(udp_fd); if(result) { - success = false; - break; + continue; } else { success = true; + break; } }