#include #include #include struct CURLM *ysiCurlMultiHandle = 0; size_t curlNullCallback(void *v, size_t size, size_t nmemb, void *vv) { return(size * nmemb); } void substr(char *dest, char *src, int position, int length) { dest[0]='\0'; strncat(dest, (src + position), length); } int main(int argc, char **argv) { CURL *curl; CURLMsg *message; CURLMcode mcode; long response = 0; int sz = 0; int counter = 1; int loop = 1; static int32_t maxusec = -1; struct timeval begin; struct timeval now; long usecdiff; char params_encrypted[4096]; char params_prefix[10]; struct curl_slist *slist = NULL; slist = curl_slist_append(slist, "Expect:"); if(!(ysiCurlMultiHandle = curl_multi_init())) { fprintf(stderr, "Could not init CURL Multi-handle\n"); return(1); } for( loop=0; loop<5;loop++ ) { if(!(curl = curl_easy_init())) { fprintf(stderr, "Error creating new CURL handle\n"); return(2); } curl_easy_setopt(curl, CURLOPT_URL, "http://testinghost/test.php"); curl_easy_setopt(curl, CURLOPT_FILETIME, 1); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 0); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlNullCallback); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params_encrypted); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); strcpy( params_encrypted, "testing"); substr(params_prefix, params_encrypted, 5, 10); curl_multi_add_handle(ysiCurlMultiHandle, curl); counter = 1; gettimeofday(&begin, 0); // Make sure we don't take more than 10ms, but get as much // done as possible within that limit do { sz = 0; mcode = curl_multi_perform(ysiCurlMultiHandle, &sz); gettimeofday(&now, 0); usecdiff = 1000000 * (now.tv_sec - begin.tv_sec) + now.tv_usec - begin.tv_usec; fprintf(stderr, "Curl :: loop=%d counter=%d code=%d handles=%d \n", loop, counter, mcode, sz); counter++; } while ( (mcode==CURLM_CALL_MULTI_PERFORM || sz>0 ) && (usecdiff < (maxusec < 0? 1000 : maxusec)) ); // Remove & clean up completed handles counter =1; while((message = curl_multi_info_read(ysiCurlMultiHandle, &sz))) { curl_easy_getinfo(message->easy_handle, CURLINFO_RESPONSE_CODE, &response); fprintf(stderr,"Response %d %d %d\n", loop, counter, response); counter++; if(message->msg == CURLMSG_DONE) { // After calling curl_multi_remove_handle, message is invalidated, // though the easy handle it references is not. CURL* easy = message->easy_handle; curl_multi_remove_handle(ysiCurlMultiHandle, easy); curl_easy_cleanup(easy); } } fprintf(stderr,"--------------------\n"); } return(0); }