Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

curl_multi_wait(3) [mojave man page]

curl_multi_wait(3)						  libcurl Manual						curl_multi_wait(3)

NAME
curl_multi_wait - polls on all easy handles in a multi handle SYNOPSIS
#include <curl/curl.h> CURLMcode curl_multi_wait(CURLM *multi_handle, struct curl_waitfd extra_fds[], unsigned int extra_nfds, int timeout_ms, int *numfds); DESCRIPTION
curl_multi_wait(3) polls all file descriptors used by the curl easy handles contained in the given multi handle set. It will block until activity is detected on at least one of the handles or timeout_ms has passed. Alternatively, if the multi handle has a pending internal timeout that has a shorter expiry time than timeout_ms, that shorter time will be used instead to make sure timeout accuracy is reasonably kept. The calling application may pass additional curl_waitfd structures which are similar to poll(2)'s pollfd structure to be waited on in the same call. On completion, if numfds is non-NULL, it will be populated with the total number of file descriptors on which interesting events occurred. This number can include both libcurl internal descriptors as well as descriptors provided in extra_fds. If no extra file descriptors are provided and libcurl has no file descriptor to offer to wait for, this function will return immediately. This function is encouraged to be used instead of select(3) when using the multi interface to allow applications to easier circumvent the common problem with 1024 maximum file descriptors. curl_waitfd struct curl_waitfd { curl_socket_t fd; short events; short revents; }; CURL_WAIT_POLLIN Bit flag to curl_waitfd.events indicating the socket should poll on read events such as new data received. CURL_WAIT_POLLPRI Bit flag to curl_waitfd.events indicating the socket should poll on high priority read events such as out of band data. CURL_WAIT_POLLOUT Bit flag to curl_waitfd.events indicating the socket should poll on write events such as the socket being clear to write without blocking. EXAMPLE
CURL *easy_handle; CURLM *multi_handle; /* add the individual easy handle */ curl_multi_add_handle(multi_handle, easy_handle); do { CURLMcode mc; int numfds; mc = curl_multi_perform(multi_handle, &still_running); if(mc == CURLM_OK ) { /* wait for activity, timeout or "nothing" */ mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds); } if(mc != CURLM_OK) { fprintf(stderr, "curl_multi failed, code %d.0, mc); break; } /* 'numfds' being zero means either a timeout or no file descriptors to wait for. Try timeout on first occurrence, then assume no file descriptors and no file descriptors to wait for means wait for 100 milliseconds. */ if(!numfds) { repeats++; /* count number of repeated zero numfds */ if(repeats > 1) { WAITMS(100); /* sleep 100 milliseconds */ } } else repeats = 0; } while(still_running); curl_multi_remove_handle(multi_handle, easy_handle); RETURN VALUE
CURLMcode type, general libcurl multi interface error code. See libcurl-errors(3) AVAILABILITY
This function was added in libcurl 7.28.0. SEE ALSO
curl_multi_fdset(3), curl_multi_perform(3) libcurl 7.54.0 March 09, 2016 curl_multi_wait(3)

Check Out this Related Man Page

curl_multi_perform(3)						  libcurl Manual					     curl_multi_perform(3)

NAME
curl_multi_perform - reads/writes available data from each easy handle SYNOPSIS
#include <curl/curl.h> CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles); DESCRIPTION
This function handles transfers on all the added handles that need attention in an non-blocking fashion. When an application has found out there's data available for the multi_handle or a timeout has elapsed, the application should call this function to read/write whatever there is to read or write right now etc. curl_multi_perform(3) returns as soon as the reads/writes are done. This function does not require that there actually is any data available for reading or that data can be written, it can be called just in case. It will write the number of handles that still transfer data in the second argument's integer-pointer. If the amount of running_handles is changed from the previous call (or is less than the amount of easy handles you've added to the multi handle), you know that there is one or more transfers less "running". You can then call curl_multi_info_read(3) to get information about each individual completed transfer, and that returned info includes CURLcode and more. If an added handle fails very quickly, it may never be counted as a running_handle. When running_handles is set to zero(0) on the return of this function, there is no longer any transfers in progress. EXAMPLE
#ifdef _WIN32 #define SHORT_SLEEP Sleep(100) #else #define SHORT_SLEEP usleep(100000) #endif fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = -1; long curl_timeo; curl_multi_timeout(multi_handle, &curl_timeo); if(curl_timeo < 0) curl_timeo = 1000; timeout.tv_sec = curl_timeo / 1000; timeout.tv_usec = (curl_timeo % 1000) * 1000; FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); /* get file descriptors from the transfers */ mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); if(maxfd == -1) { SHORT_SLEEP; rc = 0; } else rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); switch(rc) { case -1: /* select error */ break; case 0: default: /* timeout or readable/writable sockets */ curl_multi_perform(multi_handle, &still_running); break; } /* if there are still transfers, loop! */ RETURN VALUE
CURLMcode type, general libcurl multi interface error code. Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_perform(3) again, before you select() on more actions. You don't have to do it immediately, but the return code means that libcurl may have more data avail- able to return or that there may be more data to send off before it is "satisfied". Do note that curl_multi_perform(3) will return CURLM_CALL_MULTI_PERFORM only when it wants to be called again immediately. When things are fine and there is nothing immediate it wants done, it'll return CURLM_OK and you need to wait for "action" and then call this function again. This function only returns errors etc regarding the whole multi stack. Problems still might have occurred on individual transfers even when this function returns CURLM_OK. Use curl_multi_info_read(3) to figure out how individual transfers did. TYPICAL USAGE
Most applications will use curl_multi_fdset(3) to get the multi_handle's file descriptors, and curl_multi_timeout(3) to get a suitable timeout period, then it'll wait for action on the file descriptors using select(3). As soon as one or more file descriptor is ready, curl_multi_perform(3) gets called. SEE ALSO
curl_multi_cleanup(3), curl_multi_init(3), curl_multi_wait(3), curl_multi_fdset(3), curl_multi_info_read(3), libcurl-errors(3) libcurl 7.54.0 February 03, 2016 curl_multi_perform(3)
Man Page