7ada996f71680cb0f7b1555a01a6e16814a57a7f galt Sun Aug 4 04:30:55 2019 -0700 Making TCP client connect more robust by trying each IP address returned by getaddrinfo() until one connects, or all have failed. diff --git src/lib/internet.c src/lib/internet.c index dcd4e14..190178b 100644 --- src/lib/internet.c +++ src/lib/internet.c @@ -530,31 +530,31 @@ struct cidr *cidrOne = internetParseOneSubnetCidr(words[i]); slAddHead(&list, cidrOne); } slReverse(&list); return list; } socklen_t getSockSize6n4(struct sockaddr_storage *sai) /* figure out the size of the structure from the socket type */ { if (sai->ss_family == AF_INET6) //ipv6 return sizeof (struct sockaddr_in6); else if (sai->ss_family == AF_INET) // ipv4 return sizeof (struct sockaddr_in); else - errAbort("unknown ss_family %d in getSockSize", sai->ss_family); + errAbort("unknown ss_family %d in getSockSize6n4", sai->ss_family); return -1; // make the compiler happy. } void trimIpv4MappingPrefix(char *ipStr) /* trim off the "::ffff:" ipv4-mapped prefix of the ipv6 address */ { if (!ipStr) errAbort("unexpected NULL ipStr in trimIpv4-mappingPrefix"); if (startsWith(IPV4MAPPED_PREFIX, ipStr)) // strip off ipv6 ipv4-mapping { int size = strlen(ipStr); int prefixSize = strlen(IPV4MAPPED_PREFIX); memmove(ipStr, ipStr + prefixSize, size - prefixSize + 1); // dest and src can overlap. } } @@ -568,46 +568,46 @@ if (inet_ntop(AF_INET6, &sai6->sin6_addr, ipStr, ipStrSize) < 0) { errAbort("ntop failed on ip\n"); } trimIpv4MappingPrefix(ipStr); } else if (sai->ss_family == AF_INET) // ipv4 { struct sockaddr_in *sai4 = (struct sockaddr_in *)sai; if (inet_ntop(AF_INET, &sai4->sin_addr, ipStr, ipStrSize) < 0) { errAbort("ntop failed on ip\n"); } } else - errAbort("unknown sai->sa_family=%d in getSockSize", sai->ss_family); + errAbort("unknown sai->sa_family=%d in getAddrAsString6n4", sai->ss_family); } void getAddrAndPortAsString6n4(struct sockaddr_storage *sai, char *ipStr, int ipStrSize, char *portStr, int portStrSize) /* convert ip and port to strings based on the socket type */ { if (sai->ss_family == AF_INET6) //ipv6 { struct sockaddr_in6 *sai6 = (struct sockaddr_in6 *)sai; int s = getnameinfo((struct sockaddr *) sai6, getSockSize6n4(sai), ipStr, ipStrSize, portStr, portStrSize, NI_NUMERICSERV | NI_NUMERICHOST); if (s != 0) errAbort("getnameinfo: %s\n", gai_strerror(s)); trimIpv4MappingPrefix(ipStr); } else if (sai->ss_family == AF_INET) // ipv4 { struct sockaddr_in *sai4 = (struct sockaddr_in *)sai; int s = getnameinfo((struct sockaddr *) sai4, getSockSize6n4(sai), ipStr, ipStrSize, portStr, portStrSize, NI_NUMERICSERV | NI_NUMERICHOST); if (s != 0) errAbort("getnameinfo: %s\n", gai_strerror(s)); } else - errAbort("unknown sai->sa_family=%d in getSockSize", sai->ss_family); + errAbort("unknown sai->sa_family=%d in getAddrAndPortAsString6n4", sai->ss_family); }