From kde-commits Fri Sep 21 17:27:22 2007 From: Simon Perreault Date: Fri, 21 Sep 2007 17:27:22 +0000 To: kde-commits Subject: branches/KDE/3.5/kdelibs/kdecore Message-Id: <1190395642.729370.3333.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=119039568522308 SVN commit 715274 by perreaul: A hostname may resolve to multiple addresses. When connection to one timeouts, we should not immediately give up. Instead, we try the other addresses. M +30 -18 kextsock.cpp --- branches/KDE/3.5/kdelibs/kdecore/kextsock.cpp #715273:715274 @@ -985,35 +985,38 @@ return -2; timeval end, now; + timeval timeout_copy = d->timeout; // Ok, things are a little tricky here // Let me explain // getaddrinfo() will return several different families of sockets // When we have to bind before we connect, we have to make sure we're binding // and connecting to the same family, or things won't work - bool doingtimeout = d->timeout.tv_sec > 0 || d->timeout.tv_usec > 0; - if (doingtimeout) - { - gettimeofday(&end, NULL); - end.tv_usec += d->timeout.tv_usec; - end.tv_sec += d->timeout.tv_sec; - if (end.tv_usec > 1000*1000) - { - end.tv_usec -= 1000*1000; - end.tv_sec++; - } -// kdDebug(170).form("Connection with timeout of %d.%06d seconds (ends in %d.%06d)\n", -// d->timeout.tv_sec, d->timeout.tv_usec, end.tv_sec, end.tv_usec); - } - KResolverResults remote = d->resRemote.results(), local = d->resLocal.results(); KResolverResults::const_iterator it, it2; //kdDebug(170) << "Starting connect to " << host() << '|' << port() // << ": have " << local.count() << " local entries and " // << remote.count() << " remote" << endl; + + int ret = -1; for (it = remote.begin(), it2 = local.begin(); it != remote.end(); ++it) { + bool doingtimeout = d->timeout.tv_sec > 0 || d->timeout.tv_usec > 0; + if (doingtimeout) + { + gettimeofday(&end, NULL); + end.tv_usec += d->timeout.tv_usec; + end.tv_sec += d->timeout.tv_sec; + if (end.tv_usec > 1000*1000) + { + end.tv_usec -= 1000*1000; + end.tv_sec++; + } + //kdDebug(170).form("Connection with timeout of %d.%06d seconds (ends in %d.%06d)\n", + // d->timeout.tv_sec, d->timeout.tv_usec, end.tv_sec, end.tv_usec); + } + //kdDebug(170) << "Trying to connect to " << (*it).address().toString() << endl; if (it2 != local.end()) { @@ -1107,9 +1110,18 @@ sockfd = -1; // kdDebug(170) << "Time out while trying to connect to " << // (*it).address().toString() << endl; - d->status = lookupDone; setError(IO_TimeOutError, 0); - return -3; // time out + ret = -3; // time out + + d->timeout.tv_usec += timeout_copy.tv_usec; + d->timeout.tv_sec += timeout_copy.tv_sec; + if (d->timeout.tv_usec < 0) + { + d->timeout.tv_usec += 1000*1000; + d->timeout.tv_sec--; + } + + continue; } // adjust remaining time @@ -1187,7 +1199,7 @@ // getting here means no socket connected or stuff like that emit connectionFailed(d->syserror); //kdDebug(170) << "Failed to connect\n"; - return -1; + return ret; } int KExtendedSocket::startAsyncConnect()