Git init
[external/curl.git] / docs / libcurl / curl_multi_socket_action.3
1 .\"
2 .TH curl_multi_socket_action 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
3 .SH NAME
4 curl_multi_socket_action \- reads/writes available data given an action
5 .SH SYNOPSIS
6 .nf
7 #include <curl/curl.h>
8
9 CURLMcode curl_multi_socket_action(CURLM * multi_handle,
10                                    curl_socket_t sockfd, int ev_bitmask,
11                                    int *running_handles);
12 .fi
13 .SH DESCRIPTION
14 When the application has detected action on a socket handled by libcurl, it
15 should call \fIcurl_multi_socket_action(3)\fP with the \fBsockfd\fP argument
16 set to the socket with the action. When the events on a socket are known, they
17 can be passed as an events bitmask \fBev_bitmask\fP by first setting
18 \fBev_bitmask\fP to 0, and then adding using bitwise OR (|) any combination of
19 events to be chosen from CURL_CSELECT_IN, CURL_CSELECT_OUT or
20 CURL_CSELECT_ERR. When the events on a socket are unknown, pass 0 instead, and
21 libcurl will test the descriptor internally.
22
23 At return, the integer \fBrunning_handles\fP points to will contain the number
24 of running easy handles within the multi handle. When this number reaches
25 zero, all transfers are complete/done. When you call
26 \fIcurl_multi_socket_action(3)\fP on a specific socket and the counter
27 decreases by one, it DOES NOT necessarily mean that this exact socket/transfer
28 is the one that completed. Use \fIcurl_multi_info_read(3)\fP to figure out
29 which easy handle that completed.
30
31 The \fBcurl_multi_socket_action(3)\fP functions inform the application about
32 updates in the socket (file descriptor) status by doing none, one, or multiple
33 calls to the socket callback function set with the CURLMOPT_SOCKETFUNCTION
34 option to \fIcurl_multi_setopt(3)\fP. They update the status with changes
35 since the previous time the callback was called.
36
37 Get the timeout time by setting the \fICURLMOPT_TIMERFUNCTION\fP option with
38 \fIcurl_multi_setopt(3)\fP. Your application will then get called with
39 information on how long to wait for socket actions at most before doing the
40 timeout action: call the \fBcurl_multi_socket_action(3)\fP function with the
41 \fBsockfd\fP argument set to CURL_SOCKET_TIMEOUT. You can also use the
42 \fIcurl_multi_timeout(3)\fP function to poll the value at any given time, but
43 for an event-based system using the callback is far better than relying on
44 polling the timeout value.
45 .SH "CALLBACK DETAILS"
46
47 The socket \fBcallback\fP function uses a prototype like this
48 .nf
49
50   int curl_socket_callback(CURL *easy,      /* easy handle */
51                            curl_socket_t s, /* socket */
52                            int action,      /* see values below */
53                            void *userp,    /* private callback pointer */
54                            void *socketp); /* private socket pointer */
55
56 .fi
57 The callback MUST return 0.
58
59 The \fIeasy\fP argument is a pointer to the easy handle that deals with this
60 particular socket. Note that a single handle may work with several sockets
61 simultaneously.
62
63 The \fIs\fP argument is the actual socket value as you use it within your
64 system.
65
66 The \fIaction\fP argument to the callback has one of five values:
67 .RS
68 .IP "CURL_POLL_NONE (0)"
69 register, not interested in readiness (yet)
70 .IP "CURL_POLL_IN (1)"
71 register, interested in read readiness
72 .IP "CURL_POLL_OUT (2)"
73 register, interested in write readiness
74 .IP "CURL_POLL_INOUT (3)"
75 register, interested in both read and write readiness
76 .IP "CURL_POLL_REMOVE (4)"
77 unregister
78 .RE
79
80 The \fIsocketp\fP argument is a private pointer you have previously set with
81 \fIcurl_multi_assign(3)\fP to be associated with the \fIs\fP socket. If no
82 pointer has been set, socketp will be NULL. This argument is of course a
83 service to applications that want to keep certain data or structs that are
84 strictly associated to the given socket.
85
86 The \fIuserp\fP argument is a private pointer you have previously set with
87 \fIcurl_multi_setopt(3)\fP and the CURLMOPT_SOCKETDATA option.
88 .SH "RETURN VALUE"
89 CURLMcode type, general libcurl multi interface error code.
90
91 Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
92 basically means that you should call \fIcurl_multi_socket_action(3)\fP again
93 before you wait for more actions on libcurl's sockets. You don't have to do it
94 immediately, but the return code means that libcurl may have more data
95 available to return or that there may be more data to send off before it is
96 "satisfied".
97
98 The return code from this function is for the whole multi stack.  Problems
99 still might have occurred on individual transfers even when one of these
100 functions return OK.
101 .SH "TYPICAL USAGE"
102 1. Create a multi handle
103
104 2. Set the socket callback with CURLMOPT_SOCKETFUNCTION
105
106 3. Set the timeout callback with CURLMOPT_TIMERFUNCTION, to get to know what
107 timeout value to use when waiting for socket activities.
108
109 4. Add easy handles with curl_multi_add_handle()
110
111 5. Provide some means to manage the sockets libcurl is using, so you can check
112 them for activity. This can be done through your application code, or by way
113 of an external library such as libevent or glib.
114
115 6. Call curl_multi_socket_action() to kickstart everything. To get one or more
116 callbacks called.
117
118 7. Wait for activity on any of libcurl's sockets, use the timeout value your
119 callback has been told
120
121 8, When activity is detected, call curl_multi_socket_action() for the
122 socket(s) that got action. If no activity is detected and the timeout expires,
123 call \fIcurl_multi_socket_action(3)\fP with \fICURL_SOCKET_TIMEOUT\fP
124 .SH AVAILABILITY
125 This function was added in libcurl 7.15.4, and is deemed stable since 7.16.0.
126 .SH "SEE ALSO"
127 .BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
128 .BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
129 .BR "the hiperfifo.c example"