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