Return to multi-single.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / docs / examples |
1.1 ! misho 1: /*************************************************************************** ! 2: * _ _ ____ _ ! 3: * Project ___| | | | _ \| | ! 4: * / __| | | | |_) | | ! 5: * | (__| |_| | _ <| |___ ! 6: * \___|\___/|_| \_\_____| ! 7: * ! 8: * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. ! 9: * ! 10: * This software is licensed as described in the file COPYING, which ! 11: * you should have received as part of this distribution. The terms ! 12: * are also available at https://curl.haxx.se/docs/copyright.html. ! 13: * ! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell ! 15: * copies of the Software, and permit persons to whom the Software is ! 16: * furnished to do so, under the terms of the COPYING file. ! 17: * ! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY ! 19: * KIND, either express or implied. ! 20: * ! 21: ***************************************************************************/ ! 22: /* <DESC> ! 23: * using the multi interface to do a single download ! 24: * </DESC> ! 25: */ ! 26: ! 27: #include <stdio.h> ! 28: #include <string.h> ! 29: ! 30: /* somewhat unix-specific */ ! 31: #include <sys/time.h> ! 32: #include <unistd.h> ! 33: ! 34: /* curl stuff */ ! 35: #include <curl/curl.h> ! 36: ! 37: #ifdef _WIN32 ! 38: #define WAITMS(x) Sleep(x) ! 39: #else ! 40: /* Portable sleep for platforms other than Windows. */ ! 41: #define WAITMS(x) \ ! 42: struct timeval wait = { 0, (x) * 1000 }; \ ! 43: (void)select(0, NULL, NULL, NULL, &wait); ! 44: #endif ! 45: ! 46: /* ! 47: * Simply download a HTTP file. ! 48: */ ! 49: int main(void) ! 50: { ! 51: CURL *http_handle; ! 52: CURLM *multi_handle; ! 53: ! 54: int still_running = 0; /* keep number of running handles */ ! 55: int repeats = 0; ! 56: ! 57: curl_global_init(CURL_GLOBAL_DEFAULT); ! 58: ! 59: http_handle = curl_easy_init(); ! 60: ! 61: /* set the options (I left out a few, you'll get the point anyway) */ ! 62: curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/"); ! 63: ! 64: /* init a multi stack */ ! 65: multi_handle = curl_multi_init(); ! 66: ! 67: /* add the individual transfers */ ! 68: curl_multi_add_handle(multi_handle, http_handle); ! 69: ! 70: /* we start some action by calling perform right away */ ! 71: curl_multi_perform(multi_handle, &still_running); ! 72: ! 73: while(still_running) { ! 74: CURLMcode mc; /* curl_multi_wait() return code */ ! 75: int numfds; ! 76: ! 77: /* wait for activity, timeout or "nothing" */ ! 78: mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds); ! 79: ! 80: if(mc != CURLM_OK) { ! 81: fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc); ! 82: break; ! 83: } ! 84: ! 85: /* 'numfds' being zero means either a timeout or no file descriptors to ! 86: wait for. Try timeout on first occurrence, then assume no file ! 87: descriptors and no file descriptors to wait for means wait for 100 ! 88: milliseconds. */ ! 89: ! 90: if(!numfds) { ! 91: repeats++; /* count number of repeated zero numfds */ ! 92: if(repeats > 1) { ! 93: WAITMS(100); /* sleep 100 milliseconds */ ! 94: } ! 95: } ! 96: else ! 97: repeats = 0; ! 98: ! 99: curl_multi_perform(multi_handle, &still_running); ! 100: } ! 101: ! 102: curl_multi_remove_handle(multi_handle, http_handle); ! 103: ! 104: curl_easy_cleanup(http_handle); ! 105: ! 106: curl_multi_cleanup(multi_handle); ! 107: ! 108: curl_global_cleanup(); ! 109: ! 110: return 0; ! 111: }