From: Jan Engelhardt Date: 2014-02-04 17:33:39.018679884 +0100 When using getaddrinfo, *all* sockets must be tried. Remove pointless casts to void *; this implicit even in C++. (The code is horribly indented and sprinkled with ifdefs much like Linux 2.4. That should be factored out into separate functions.) --- gsoap/stdsoap2.cpp | 14 +++++++++++--- gsoap/stdsoap2.h | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) Index: gsoap-2.8.17/gsoap/stdsoap2.cpp =================================================================== --- gsoap-2.8.17.orig/gsoap/stdsoap2.cpp +++ gsoap-2.8.17/gsoap/stdsoap2.cpp @@ -3847,7 +3847,7 @@ tcp_connect(struct soap *soap, const cha } soap->errmode = 0; #ifdef WITH_IPV6 - memset((void*)&hints, 0, sizeof(hints)); + memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) @@ -3868,7 +3868,7 @@ tcp_connect(struct soap *soap, const cha again: sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->errmode = 0; -#else +#else /* WITH_IPV6 */ #ifndef WITH_LEAN again: #endif @@ -3878,7 +3878,7 @@ again: else #endif sk = socket(AF_INET, SOCK_STREAM, 0); -#endif +#endif /* WITH_IPV6 */ if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 @@ -4081,6 +4081,7 @@ again: SOAP_SOCKBLOCK(sk) retries = 10; #endif + for (;;) { #ifdef WITH_IPV6 @@ -4089,6 +4090,13 @@ again: if (connect(sk, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) #endif { err = soap_socket_errno(sk); +#ifdef WITH_IPV6 + if (err == SOAP_ECONNREFUSED && res->ai_next != NULL) { + soap->fclosesocket(soap, sk); + res = res->ai_next; + goto again; + } +#endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); Index: gsoap-2.8.17/gsoap/stdsoap2.h =================================================================== --- gsoap-2.8.17.orig/gsoap/stdsoap2.h +++ gsoap-2.8.17/gsoap/stdsoap2.h @@ -972,11 +972,13 @@ extern "C" { # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE +# define SOAP_ECONNREFUSED WSAECONNREFUSED #else # define SOAP_ERANGE ERANGE # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE +# define SOAP_ECONNREFUSED ECONNREFUSED # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899