program testmult; (* Example using curl_multi library calls *) {$INCLUDE curltest.inc} uses {$IFDEF LINUX}Libc,{$ELSE}winsock,{$ENDIF}curl_h; {$IFDEF WIN32} type pIOFile=pointer; function fopen ( path, mode: pChar ): pIOFile; cdecl; external 'msvcrt.dll' name 'fopen'; function fclose ( f:pIOFile ): LongInt; cdecl; external 'msvcrt.dll' name 'fclose'; {$ENDIF} function progress_callback( UserData:pChar; DownloadTotal:double; DownloadNow:double; UploadTotal:double; UploadNow:double ): LongInt; cdecl; begin WriteLn(UserData, ':', DownloadNow:8:0,' of ' ,DownloadTotal:8:0); Result:=0; end; var multi_handle:pCurlM; http_handle_one:pCurl; http_handle_two:pCurl; still_running:LongInt; timeout: TimeVal; rc: LongInt; fdread: tFDSet; fdwrite: tFDSet; fdexcep: tFDSet; maxfd: LongInt; file_one, file_two: pIOFile; url_one, url_two: pChar; begin url_one:='http://www.cbs.com/'; url_two:='http://www.cnn.com/'; http_handle_one := curl_easy_init(); http_handle_two := curl_easy_init(); curl_easy_setopt(http_handle_one, CURLOPT_URL, url_one); curl_easy_setopt(http_handle_two, CURLOPT_URL, url_two); curl_easy_setopt(http_handle_one, CURLOPT_FOLLOWLOCATION, True); curl_easy_setopt(http_handle_two, CURLOPT_FOLLOWLOCATION, True); file_one:=fopen('temp_one.htm', 'wb'); file_two:=fopen('temp_two.htm', 'wb'); curl_easy_setopt(http_handle_one, CURLOPT_FILE, file_one); curl_easy_setopt(http_handle_two, CURLOPT_FILE, file_two); curl_easy_setopt(http_handle_one, CURLOPT_NOPROGRESS, False); curl_easy_setopt(http_handle_two, CURLOPT_NOPROGRESS, False); curl_easy_setopt(http_handle_one, CURLOPT_PROGRESSFUNCTION, @progress_callback); curl_easy_setopt(http_handle_two, CURLOPT_PROGRESSFUNCTION, @progress_callback); curl_easy_setopt(http_handle_one, CURLOPT_PROGRESSDATA, url_one); curl_easy_setopt(http_handle_two, CURLOPT_PROGRESSDATA, url_two); multi_handle := curl_multi_init(); curl_multi_add_handle(multi_handle, http_handle_one); curl_multi_add_handle(multi_handle, http_handle_two); while ( curl_multi_perform(multi_handle, @still_running) = CURLM_CALL_MULTI_PERFORM ) do {nothing}; while(still_running <> 0 ) do begin FD_ZERO(fdread); FD_ZERO(fdwrite); FD_ZERO(fdexcep); timeout.tv_sec := 1; timeout.tv_usec := 0; curl_multi_fdset(multi_handle, @fdread, @fdwrite, @fdexcep, @maxfd); rc := select(maxfd + 1, @fdread, @fdwrite, @fdexcep, @timeout); if ( rc <> -1 ) then while ( curl_multi_perform(multi_handle, @still_running) = CURLM_CALL_MULTI_PERFORM ) do {nothing}; end; fclose(file_one); fclose(file_two); curl_multi_cleanup(multi_handle); curl_easy_cleanup(http_handle_one); curl_easy_cleanup(http_handle_two); end.