xref: /aosp_15_r20/external/curl/docs/libcurl/libcurl-multi.md (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker---
2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al.
3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl
4*6236dae4SAndroid Build Coastguard WorkerTitle: libcurl-multi
5*6236dae4SAndroid Build Coastguard WorkerSection: 3
6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl
7*6236dae4SAndroid Build Coastguard WorkerSee-also:
8*6236dae4SAndroid Build Coastguard Worker  - libcurl (3)
9*6236dae4SAndroid Build Coastguard Worker  - libcurl-easy (3)
10*6236dae4SAndroid Build Coastguard Worker  - libcurl-errors (3)
11*6236dae4SAndroid Build Coastguard WorkerProtocol:
12*6236dae4SAndroid Build Coastguard Worker  - All
13*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.9.6
14*6236dae4SAndroid Build Coastguard Worker---
15*6236dae4SAndroid Build Coastguard Worker
16*6236dae4SAndroid Build Coastguard Worker# NAME
17*6236dae4SAndroid Build Coastguard Worker
18*6236dae4SAndroid Build Coastguard Workerlibcurl-multi - how to use the multi interface
19*6236dae4SAndroid Build Coastguard Worker
20*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
21*6236dae4SAndroid Build Coastguard Worker
22*6236dae4SAndroid Build Coastguard WorkerThis is an overview on how to use the libcurl multi interface in your C
23*6236dae4SAndroid Build Coastguard Workerprograms. There are specific man pages for each function mentioned in
24*6236dae4SAndroid Build Coastguard Workerhere. There is also the libcurl-tutorial(3) man page for a complete
25*6236dae4SAndroid Build Coastguard Workertutorial to programming with libcurl and the libcurl-easy(3) man page
26*6236dae4SAndroid Build Coastguard Workerfor an overview of the libcurl easy interface.
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard WorkerAll functions in the multi interface are prefixed with curl_multi.
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker# OBJECTIVES
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard WorkerThe multi interface offers several abilities that the easy interface does not.
33*6236dae4SAndroid Build Coastguard WorkerThey are mainly:
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard Worker1. Enable a "pull" interface. The application that uses libcurl decides where
36*6236dae4SAndroid Build Coastguard Workerand when to ask libcurl to get/send data.
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard Worker2. Enable multiple simultaneous transfers in the same thread without making it
39*6236dae4SAndroid Build Coastguard Workercomplicated for the application.
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Worker3. Enable the application to wait for action on its own file descriptors and
42*6236dae4SAndroid Build Coastguard Workercurl's file descriptors simultaneously.
43*6236dae4SAndroid Build Coastguard Worker
44*6236dae4SAndroid Build Coastguard Worker4. Enable event-based handling and scaling transfers up to and beyond
45*6236dae4SAndroid Build Coastguard Workerthousands of parallel connections.
46*6236dae4SAndroid Build Coastguard Worker
47*6236dae4SAndroid Build Coastguard Worker# ONE MULTI HANDLE MANY EASY HANDLES
48*6236dae4SAndroid Build Coastguard Worker
49*6236dae4SAndroid Build Coastguard WorkerTo use the multi interface, you must first create a 'multi handle' with
50*6236dae4SAndroid Build Coastguard Workercurl_multi_init(3). This handle is then used as input to all further
51*6236dae4SAndroid Build Coastguard Workercurl_multi_* functions.
52*6236dae4SAndroid Build Coastguard Worker
53*6236dae4SAndroid Build Coastguard WorkerWith a multi handle and the multi interface you can do several simultaneous
54*6236dae4SAndroid Build Coastguard Workertransfers in parallel. Each single transfer is built up around an easy
55*6236dae4SAndroid Build Coastguard Workerhandle. You create all the easy handles you need, and setup the appropriate
56*6236dae4SAndroid Build Coastguard Workeroptions for each easy handle using curl_easy_setopt(3).
57*6236dae4SAndroid Build Coastguard Worker
58*6236dae4SAndroid Build Coastguard WorkerThere are two flavors of the multi interface, the select() oriented one and
59*6236dae4SAndroid Build Coastguard Workerthe event based one we call multi_socket. You benefit from reading through the
60*6236dae4SAndroid Build Coastguard Workerdescription of both versions to fully understand how they work and
61*6236dae4SAndroid Build Coastguard Workerdifferentiate. We start out with the select() oriented version.
62*6236dae4SAndroid Build Coastguard Worker
63*6236dae4SAndroid Build Coastguard WorkerWhen an easy handle is setup and ready for transfer, then instead of using
64*6236dae4SAndroid Build Coastguard Workercurl_easy_perform(3) like when using the easy interface for transfers,
65*6236dae4SAndroid Build Coastguard Workeryou should add the easy handle to the multi handle with
66*6236dae4SAndroid Build Coastguard Workercurl_multi_add_handle(3). You can add more easy handles to a multi
67*6236dae4SAndroid Build Coastguard Workerhandle at any point, even if other transfers are already running.
68*6236dae4SAndroid Build Coastguard Worker
69*6236dae4SAndroid Build Coastguard WorkerShould you change your mind, the easy handle is again removed from the multi
70*6236dae4SAndroid Build Coastguard Workerstack using curl_multi_remove_handle(3). Once removed from the multi
71*6236dae4SAndroid Build Coastguard Workerhandle, you can again use other easy interface functions like
72*6236dae4SAndroid Build Coastguard Workercurl_easy_perform(3) on the handle or whatever you think is
73*6236dae4SAndroid Build Coastguard Workernecessary. You can remove handles at any point during transfers.
74*6236dae4SAndroid Build Coastguard Worker
75*6236dae4SAndroid Build Coastguard WorkerAdding the easy handle to the multi handle does not start the transfer.
76*6236dae4SAndroid Build Coastguard WorkerRemember that one of the main ideas with this interface is to let your
77*6236dae4SAndroid Build Coastguard Workerapplication drive. You drive the transfers by invoking
78*6236dae4SAndroid Build Coastguard Workercurl_multi_perform(3). libcurl then transfers data if there is anything
79*6236dae4SAndroid Build Coastguard Workeravailable to transfer. It uses the callbacks and everything else you have
80*6236dae4SAndroid Build Coastguard Workersetup in the individual easy handles. It transfers data on all current
81*6236dae4SAndroid Build Coastguard Workertransfers in the multi stack that are ready to transfer anything. It may be
82*6236dae4SAndroid Build Coastguard Workerall, it may be none. When there is nothing more to do for now, it returns back
83*6236dae4SAndroid Build Coastguard Workerto the calling application.
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard WorkerYour application extracts info from libcurl about when it would like to get
86*6236dae4SAndroid Build Coastguard Workerinvoked to transfer data or do other work. The most convenient way is to use
87*6236dae4SAndroid Build Coastguard Workercurl_multi_poll(3) that helps you wait until the application should call
88*6236dae4SAndroid Build Coastguard Workerlibcurl again. The older API to accomplish the same thing is
89*6236dae4SAndroid Build Coastguard Workercurl_multi_fdset(3) that extracts *fd_sets* from libcurl to use in
90*6236dae4SAndroid Build Coastguard Workerselect() or poll() calls in order to get to know when the transfers in the
91*6236dae4SAndroid Build Coastguard Workermulti stack might need attention. Both these APIs allow for your program to
92*6236dae4SAndroid Build Coastguard Workerwait for input on your own private file descriptors at the same time.
93*6236dae4SAndroid Build Coastguard Workercurl_multi_timeout(3) also helps you with providing a suitable timeout
94*6236dae4SAndroid Build Coastguard Workerperiod for your select() calls.
95*6236dae4SAndroid Build Coastguard Worker
96*6236dae4SAndroid Build Coastguard Workercurl_multi_perform(3) stores the number of still running transfers in
97*6236dae4SAndroid Build Coastguard Workerone of its input arguments, and by reading that you can figure out when all
98*6236dae4SAndroid Build Coastguard Workerthe transfers in the multi handles are done. 'done' does not mean
99*6236dae4SAndroid Build Coastguard Workersuccessful. One or more of the transfers may have failed.
100*6236dae4SAndroid Build Coastguard Worker
101*6236dae4SAndroid Build Coastguard WorkerTo get information about completed transfers, to figure out success or not and
102*6236dae4SAndroid Build Coastguard Workersimilar, curl_multi_info_read(3) should be called. It can return a
103*6236dae4SAndroid Build Coastguard Workermessage about a current or previous transfer. Repeated invokes of the function
104*6236dae4SAndroid Build Coastguard Workerget more messages until the message queue is empty. The information you
105*6236dae4SAndroid Build Coastguard Workerreceive there includes an easy handle pointer which you may use to identify
106*6236dae4SAndroid Build Coastguard Workerwhich easy handle the information regards.
107*6236dae4SAndroid Build Coastguard Worker
108*6236dae4SAndroid Build Coastguard WorkerWhen a single transfer is completed, the easy handle is still left added to
109*6236dae4SAndroid Build Coastguard Workerthe multi stack. You need to first remove the easy handle with
110*6236dae4SAndroid Build Coastguard Workercurl_multi_remove_handle(3) and then close it with
111*6236dae4SAndroid Build Coastguard Workercurl_easy_cleanup(3), or possibly set new options to it and add it again
112*6236dae4SAndroid Build Coastguard Workerwith curl_multi_add_handle(3) to start another transfer.
113*6236dae4SAndroid Build Coastguard Worker
114*6236dae4SAndroid Build Coastguard WorkerWhen all transfers in the multi stack are done, close the multi handle with
115*6236dae4SAndroid Build Coastguard Workercurl_multi_cleanup(3). Be careful and please note that you **MUST**
116*6236dae4SAndroid Build Coastguard Workerinvoke separate curl_easy_cleanup(3) calls for every single easy handle
117*6236dae4SAndroid Build Coastguard Workerto clean them up properly.
118*6236dae4SAndroid Build Coastguard Worker
119*6236dae4SAndroid Build Coastguard WorkerIf you want to reuse an easy handle that was added to the multi handle for
120*6236dae4SAndroid Build Coastguard Workertransfer, you must first remove it from the multi stack and then re-add it
121*6236dae4SAndroid Build Coastguard Workeragain (possibly after having altered some options at your own choice).
122*6236dae4SAndroid Build Coastguard Worker
123*6236dae4SAndroid Build Coastguard Worker# MULTI_SOCKET
124*6236dae4SAndroid Build Coastguard Worker
125*6236dae4SAndroid Build Coastguard Workercurl_multi_socket_action(3) function offers a way for applications to
126*6236dae4SAndroid Build Coastguard Workernot only avoid being forced to use select(), but it also offers a much more
127*6236dae4SAndroid Build Coastguard Workerhigh-performance API that makes a significant difference for applications
128*6236dae4SAndroid Build Coastguard Workerusing large numbers of simultaneous connections.
129*6236dae4SAndroid Build Coastguard Worker
130*6236dae4SAndroid Build Coastguard Workercurl_multi_socket_action(3) is then used instead of
131*6236dae4SAndroid Build Coastguard Workercurl_multi_perform(3).
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard WorkerWhen using this API, you add easy handles to the multi handle just as with the
134*6236dae4SAndroid Build Coastguard Workernormal multi interface. Then you also set two callbacks with the
135*6236dae4SAndroid Build Coastguard WorkerCURLMOPT_SOCKETFUNCTION(3) and CURLMOPT_TIMERFUNCTION(3) options
136*6236dae4SAndroid Build Coastguard Workerto curl_multi_setopt(3). They are two callback functions that libcurl
137*6236dae4SAndroid Build Coastguard Workercalls with information about what sockets to wait for, and for what activity,
138*6236dae4SAndroid Build Coastguard Workerand what the current timeout time is - if that expires libcurl should be
139*6236dae4SAndroid Build Coastguard Workernotified.
140*6236dae4SAndroid Build Coastguard Worker
141*6236dae4SAndroid Build Coastguard WorkerThe multi_socket API is designed to inform your application about which
142*6236dae4SAndroid Build Coastguard Workersockets libcurl is currently using and for what activities (read and/or write)
143*6236dae4SAndroid Build Coastguard Workeron those sockets your application is expected to wait for.
144*6236dae4SAndroid Build Coastguard Worker
145*6236dae4SAndroid Build Coastguard WorkerYour application must make sure to receive all sockets informed about in the
146*6236dae4SAndroid Build Coastguard WorkerCURLMOPT_SOCKETFUNCTION(3) callback and make sure it reacts on the given
147*6236dae4SAndroid Build Coastguard Workeractivity on them. When a socket has the given activity, you call
148*6236dae4SAndroid Build Coastguard Workercurl_multi_socket_action(3) specifying which socket and action there
149*6236dae4SAndroid Build Coastguard Workerare.
150*6236dae4SAndroid Build Coastguard Worker
151*6236dae4SAndroid Build Coastguard WorkerThe CURLMOPT_TIMERFUNCTION(3) callback is called to set a timeout. When
152*6236dae4SAndroid Build Coastguard Workerthat timeout expires, your application should call the
153*6236dae4SAndroid Build Coastguard Workercurl_multi_socket_action(3) function saying it was due to a timeout.
154*6236dae4SAndroid Build Coastguard Worker
155*6236dae4SAndroid Build Coastguard WorkerThis API is typically used with an event-driven underlying functionality (like
156*6236dae4SAndroid Build Coastguard Workerlibevent, libev, kqueue, epoll or similar) with which the application
157*6236dae4SAndroid Build Coastguard Worker"subscribes" on socket changes. This allows applications and libcurl to much
158*6236dae4SAndroid Build Coastguard Workerbetter scale upward and beyond thousands of simultaneous transfers without
159*6236dae4SAndroid Build Coastguard Workerlosing performance.
160*6236dae4SAndroid Build Coastguard Worker
161*6236dae4SAndroid Build Coastguard WorkerWhen you have added your initial set of handles, you call
162*6236dae4SAndroid Build Coastguard Workercurl_multi_socket_action(3) with CURL_SOCKET_TIMEOUT set in the
163*6236dae4SAndroid Build Coastguard Worker*sockfd* argument, and you get callbacks invoked that set you up and you
164*6236dae4SAndroid Build Coastguard Workerthen continue to call curl_multi_socket_action(3) accordingly when you
165*6236dae4SAndroid Build Coastguard Workerget activity on the sockets you have been asked to wait on, or if the timeout
166*6236dae4SAndroid Build Coastguard Workertimer expires.
167*6236dae4SAndroid Build Coastguard Worker
168*6236dae4SAndroid Build Coastguard WorkerYou can poll curl_multi_info_read(3) to see if any transfer has
169*6236dae4SAndroid Build Coastguard Workercompleted, as it then has a message saying so.
170*6236dae4SAndroid Build Coastguard Worker
171*6236dae4SAndroid Build Coastguard Worker# BLOCKING
172*6236dae4SAndroid Build Coastguard Worker
173*6236dae4SAndroid Build Coastguard WorkerA few areas in the code are still using blocking code, even when used from the
174*6236dae4SAndroid Build Coastguard Workermulti interface. While we certainly want and intend for these to get fixed in
175*6236dae4SAndroid Build Coastguard Workerthe future, you should be aware of the following current restrictions:
176*6236dae4SAndroid Build Coastguard Worker
177*6236dae4SAndroid Build Coastguard Worker~~~c
178*6236dae4SAndroid Build Coastguard Worker - Name resolves unless the c-ares or threaded-resolver backends are used
179*6236dae4SAndroid Build Coastguard Worker - file:// transfers
180*6236dae4SAndroid Build Coastguard Worker - TELNET transfers
181*6236dae4SAndroid Build Coastguard Worker~~~
182