diff options
Diffstat (limited to 'src/SocketAddr.c')
-rw-r--r-- | src/SocketAddr.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/SocketAddr.c b/src/SocketAddr.c index 4322475..b42d272 100644 --- a/src/SocketAddr.c +++ b/src/SocketAddr.c @@ -62,6 +62,16 @@ extern "C" { #endif +int SockAddr_getAFdomain (iperf_sockaddr *inSockAddr) { + return (SockAddr_isIPv6(inSockAddr) ? +#if HAVE_IPV6 + AF_INET6 +#else + AF_INET +#endif + : AF_INET); +} + /* ------------------------------------------------------------------- * Create a socket address. If inHostname is not null, resolve that * address and fill it in. Fill in the port number. Use IPv6 ADDR_ANY @@ -70,7 +80,7 @@ extern "C" { void SockAddr_remoteAddr (struct thread_Settings *inSettings) { if (SockAddr_isZeroAddress(&inSettings->peer) == 0) { if (inSettings->mHost != NULL) { - SockAddr_setHostname(inSettings->mHost, &inSettings->peer, isIPV6(inSettings)); + SockAddr_setHostname(inSettings->mHost, &inSettings->peer, &inSettings->size_peer, isIPV6(inSettings)); if (inSettings->incrdstip) SockAddr_incrAddress(&inSettings->peer, inSettings->incrdstip); } else { @@ -100,11 +110,10 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) { SockAddr_zeroAddress(&inSettings->local); if (inSettings->mLocalhost != NULL) { - SockAddr_setHostname(inSettings->mLocalhost, &inSettings->local, + SockAddr_setHostname(inSettings->mLocalhost, &inSettings->local, &inSettings->size_local, isIPV6(inSettings)); if (inSettings->incrsrcip) SockAddr_incrAddress(&inSettings->local, inSettings->incrsrcip); - } else { #if HAVE_IPV6 if (isIPV6(inSettings)) { @@ -158,11 +167,6 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) { /* * User specified port so use it */ -#if HAVE_DECL_SO_REUSEPORT - int boolean = 1; - Socklen_t len = sizeof(boolean); - setsockopt(inSettings->mSock, SOL_SOCKET, SO_REUSEPORT, (char*) &boolean, len); -#endif SockAddr_setPort(&inSettings->local, (inSettings->mBindPort + inSettings->incrsrcport)); } else { /* @@ -179,12 +183,13 @@ void SockAddr_localAddr (struct thread_Settings *inSettings) { } } } + // end SocketAddr /* ------------------------------------------------------------------- * Resolve the hostname address and fill it in. * ------------------------------------------------------------------- */ -void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, int isIPv6) { +void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, Socklen_t *addr_size, int isIPv6) { // ..I think this works for both ipv6 & ipv4... we'll see bool found = false; int ret_ga; @@ -201,6 +206,7 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i while (itr != NULL) { if (itr->ai_family == AF_INET) { memcpy(inSockAddr, (itr->ai_addr), (itr->ai_addrlen)); + *addr_size = (Socklen_t) sizeof(struct sockaddr_in); freeaddrinfo(res); found = true; break; @@ -223,6 +229,7 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i if (itr->ai_family == AF_INET6) { memcpy(inSockAddr, (itr->ai_addr), (itr->ai_addrlen)); freeaddrinfo(res); + *addr_size = (Socklen_t) sizeof(struct sockaddr_in6); found = true; break; } else { @@ -271,7 +278,11 @@ void SockAddr_setHostname (const char* inHostname, iperf_sockaddr *inSockAddr, i } } if (!found) { - fprintf(stderr, "ERROR: failed to find an ip address for host '%s'\n", inHostname); + if (!isIPv6) { + fprintf(stderr, "ERROR: failed to find an ip address for host '%s'\n", inHostname); + } else { + fprintf(stderr, "ERROR: failed to find an ipv6 address for host '%s'\n", inHostname); + } exit(1); } } |