On Mar 22, 2009, at 12:27 AM, Daniel Stenberg wrote:
On Sat, 21 Mar 2009, Chad Monroe wrote:
Thanks for the quick response. The reason I continue to poll() on
sockets "not used by libcurl any longer" is because
curl_multi_fdset() returns them in the fd_set data even after the
connection has finished. I assume this is because libcurl leaves
the sockets open as denoted by the message:
* Connection #0 to host 10.4.4.204 left intact
I'm not sure if this is the intended behavior of curl_multi_fdset()
or if it's possibly a bug. If you think it's an issue I can
investigate further if you'd like.
The fact that the connection is left open simply means that it'll be
kept in the connection cache and thus is subject for a later re-use.
curl_multi_fdset() should only ever return socket bit about sockets
that are in active current use by an easy handle so if it truly
returns info about a socket no longer used it is definately an error
and if you can produce a sample app that shows this happening I'll
be very interested!
--
/ daniel.haxx.se
Hi Daniel,
I started writing a test program and discovered a bug in the code I
use to transform fd_set data into something poll() can use. I keep an
integer, curl_fd_max as returned by curl_multi_fdset(). I then scan
from 0 to curl_fd_max and add/remove descriptors to/from my local copy
of the fd_set struct and poll() as needed. The problem was when the
highest numbered descriptor closes. I'd never scan high enough to
remove it as curl_fd_max would be decreased.
The fix was simply to cache the last known curl_fd_max value, call
curl_multi_fdset, compare the old and new max values, then use the
largest. This ensures that high number descriptors no longer in use
get cleared.
With this fix in place, libcurl performs exactly as I'd expect, even
without the use of CURLOPT_FORBID_REUSE. Thanks for pointing me in the
right direction on this one!
--
Chad Monroe