examples: Don't call select() to sleep on windows

Windows does not support using select() for sleeping without a dummy
socket. Instead use Windows' Sleep() and sleep for 100ms which is the
minimum suggested value in the curl_multi_fdset() doc.

Prior to this change the multi examples would exit prematurely since
select() would error instead of sleeping when called without an fd.

Reported-by: Johan Lantz
Bug: http://curl.haxx.se/mail/lib-2014-11/0221.html
This commit is contained in:
Jay Satiro
2014-11-14 03:59:46 -05:00
committed by Daniel Stenberg
parent ed77fdf389
commit a607f8a20c
9 changed files with 222 additions and 66 deletions

View File

@@ -147,6 +147,7 @@ int main(void)
do {
struct timeval timeout;
int rc; /* select() return code */
CURLMcode mc; /* curl_multi_fdset() return code */
fd_set fdread;
fd_set fdwrite;
@@ -173,15 +174,31 @@ int main(void)
}
/* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
/* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially in
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */
if(mc != CURLM_OK)
{
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break;
}
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
/* On success the value of maxfd is guaranteed to be >= -1. We call
select(maxfd + 1, ...); specially in case of (maxfd == -1) we call
select(0, ...), which is basically equal to sleeping the timeout. On
Windows we can't sleep via select without a dummy socket and instead
we Sleep() for 100ms which is the minimum suggested value in the
curl_multi_fdset() doc. */
#ifdef _WIN32
if(maxfd == -1) {
Sleep(100);
rc = 0;
}
else
#endif
{
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
case -1: