#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);
}