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.
bool success = false;
for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) {
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) {
- 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);
- success = false;
- break;