1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. 99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which 11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms 12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://curl.haxx.se/docs/copyright.html. 13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is 16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file. 17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied. 20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/ 22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* This is a very simple example using the multi interface. */ 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <stdio.h> 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <string.h> 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* somewhat unix-specific */ 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/time.h> 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <unistd.h> 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* curl stuff */ 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <curl/curl.h> 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef _WIN32 35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define WAITMS(x) Sleep(x) 36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#else 37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Portable sleep for platforms other than Windows. */ 38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define WAITMS(x) \ 39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct timeval wait = { 0, (x) * 1000 }; \ 40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (void)select(0, NULL, NULL, NULL, &wait); 41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Simply download a HTTP file. 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint main(void) 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *http_handle; 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLM *multi_handle; 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int still_running; /* keep number of running handles */ 52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int repeats = 0; 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_global_init(CURL_GLOBAL_DEFAULT); 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels http_handle = curl_easy_init(); 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* set the options (I left out a few, you'll get the point anyway) */ 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/"); 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* init a multi stack */ 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels multi_handle = curl_multi_init(); 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* add the individual transfers */ 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_multi_add_handle(multi_handle, http_handle); 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* we start some action by calling perform right away */ 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_multi_perform(multi_handle, &still_running); 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET do { 71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET CURLMcode mc; /* curl_multi_wait() return code */ 72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int numfds; 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* wait for activity, timeout or "nothing" */ 75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds); 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(mc != CURLM_OK) 78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET { 79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET break; 81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* 'numfds' being zero means either a timeout or no file descriptors to 84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET wait for. Try timeout on first occurrence, then assume no file 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET descriptors and no file descriptors to wait for means wait for 100 86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET milliseconds. */ 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(!numfds) { 89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET repeats++; /* count number of repeated zero numfds */ 90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(repeats > 1) { 91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET WAITMS(100); /* sleep 100 milliseconds */ 92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET else 95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET repeats = 0; 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_multi_perform(multi_handle, &still_running); 98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while(still_running); 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_multi_remove_handle(multi_handle, http_handle); 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_easy_cleanup(http_handle); 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_multi_cleanup(multi_handle); 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_global_cleanup(); 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 110