#include <curl/curl.h> int socket_callback(CURL *easy, /* easy handle */ curl_socket_t s, /* socket */ int what, /* describes the socket */ void *userp, /* private callback pointer */ void *socketp); /* private socket pointer */ CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION, socket_callback);
When the curl_multi_socket_action(3) function is called, it informs the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket_callback. The callback function gets status updates with changes since the previous time the callback was called. If the given callback pointer is set to NULL, no callback will be called.
s is the specific socket this function invocation concerns. If the what argument is not CURL_POLL_REMOVE then it holds information about what activity on this socket the application is supposed to monitor. Subsequent calls to this callback might update the what bits for a socket that is already monitored.
userp is set with CURLMOPT_SOCKETDATA(3).
socketp is set with curl_multi_assign(3) or will be NULL.
The what parameter informs the callback on the status of the given socket. It can hold one of these values:
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) { GlobalInfo *g = (GlobalInfo*) cbp; SockInfo *fdp = (SockInfo*) sockp; if(what == CURL_POLL_REMOVE) { remsock(fdp); } else { if(!fdp) { addsock(s, e, what, g); } else { setsock(fdp, s, e, what, g); } } return 0; } main() { GlobalInfo setup; /* ... use socket callback and custom pointer */ curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, sock_cb); curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, &setup); }