diff --git a/multi/Makefile.am b/multi/Makefile.am new file mode 100644 index 000000000..013c1dbd6 --- /dev/null +++ b/multi/Makefile.am @@ -0,0 +1,21 @@ +# +# $Id$ +# + +INCLUDES = -I$(top_srcdir)/include + +bin_PROGRAMS = app single double + +app_SOURCES = app.c +app_LDADD = ../lib/libcurl.la +app_DEPENDENCIES = ../lib/libcurl.la + +single_SOURCES = single.c +single_LDADD = ../lib/libcurl.la +single_DEPENDENCIES = ../lib/libcurl.la + +double_SOURCES = double.c +double_LDADD = ../lib/libcurl.la +double_DEPENDENCIES = ../lib/libcurl.la + +AUTOMAKE_OPTIONS = foreign no-dependencies diff --git a/multi/app.c b/multi/app.c new file mode 100644 index 000000000..9ed5bf236 --- /dev/null +++ b/multi/app.c @@ -0,0 +1,92 @@ +/* + * This is an example application source code using the multi interface. + */ + +#include +#include + +/* somewhat unix-specific */ +#include +#include + + +/* To start with, we include the header from the lib directory. This should + later of course be moved to the proper include dir. */ +#include "../lib/multi.h" + +/* + * Download a HTTP file and upload an FTP file simultaneously. + */ +int main(int argc, char **argv) +{ + CURL *http_handle; + CURL *ftp_handle; + CURLM *multi_handle; + + int still_running; /* keep number of running handles */ + + http_handle = curl_easy_init(); + ftp_handle = curl_easy_init(); + + /* set the options (I left out a few, you'll get the point anyway) */ + curl_easy_setopt(http_handle, CURLOPT_URL, "http://website.com"); + + curl_easy_setopt(ftp_handle, CURLOPT_URL, "ftp://ftpsite.com"); + curl_easy_setopt(ftp_handle, CURLOPT_UPLOAD, TRUE); + + /* init a multi stack */ + multi_handle = curl_multi_init(); + + /* add the individual transfers */ + curl_multi_add_handle(multi_handle, http_handle); + curl_multi_add_handle(multi_handle, ftp_handle); + + /* we start some action by calling perform right away */ + while(CURLM_CALL_MULTI_PERFORM == + curl_multi_perform(multi_handle, &still_running)); + + while(still_running) { + struct timeval timeout; + int rc; /* select() return code */ + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + switch(rc) { + case -1: + /* select error */ + break; + case 0: + /* timeout, do something else */ + break; + default: + /* one or more of curl's file descriptors say there's data to read + or write */ + curl_multi_perform(multi_handle, &still_running); + break; + } + } + + curl_multi_cleanup(multi_handle); + + curl_easy_cleanup(http_handle); + curl_easy_cleanup(ftp_handle); + + + return 0; +} diff --git a/multi/double.c b/multi/double.c new file mode 100644 index 000000000..c850b0fe4 --- /dev/null +++ b/multi/double.c @@ -0,0 +1,87 @@ +/* + * This is a simple example using the multi interface. + */ + +#include +#include + +/* somewhat unix-specific */ +#include +#include + +/* To start with, we include the header from the lib directory. This should + later of course be moved to the proper include dir. */ +#include "../lib/multi.h" + +/* + * Simply download two HTTP files! + */ +int main(int argc, char **argv) +{ + CURL *http_handle; + CURL *http_handle2; + CURLM *multi_handle; + + int still_running; /* keep number of running handles */ + + http_handle = curl_easy_init(); + http_handle2 = curl_easy_init(); + + /* set options */ + curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/"); + + /* set options */ + curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/"); + + /* init a multi stack */ + multi_handle = curl_multi_init(); + + /* add the individual transfers */ + curl_multi_add_handle(multi_handle, http_handle); + curl_multi_add_handle(multi_handle, http_handle2); + + /* we start some action by calling perform right away */ + while(CURLM_CALL_MULTI_PERFORM == + curl_multi_perform(multi_handle, &still_running)); + + while(still_running) { + struct timeval timeout; + int rc; /* select() return code */ + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + switch(rc) { + case -1: + /* select error */ + break; + case 0: + default: + /* timeout or readable/writable sockets */ + curl_multi_perform(multi_handle, &still_running); + break; + } + } + + curl_multi_cleanup(multi_handle); + + curl_easy_cleanup(http_handle); + curl_easy_cleanup(http_handle2); + + return 0; +} diff --git a/multi/single.c b/multi/single.c new file mode 100644 index 000000000..d17e03396 --- /dev/null +++ b/multi/single.c @@ -0,0 +1,80 @@ +/* + * This is a very simple example using the multi interface. + */ + +#include +#include + +/* somewhat unix-specific */ +#include +#include + +/* To start with, we include the header from the lib directory. This should + later of course be moved to the proper include dir. */ +#include "../lib/multi.h" + +/* + * Simply download a HTTP file. + */ +int main(int argc, char **argv) +{ + CURL *http_handle; + CURLM *multi_handle; + + int still_running; /* keep number of running handles */ + + http_handle = curl_easy_init(); + + /* set the options (I left out a few, you'll get the point anyway) */ + curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/"); + + /* init a multi stack */ + multi_handle = curl_multi_init(); + + /* add the individual transfers */ + curl_multi_add_handle(multi_handle, http_handle); + + /* we start some action by calling perform right away */ + while(CURLM_CALL_MULTI_PERFORM == + curl_multi_perform(multi_handle, &still_running)); + + while(still_running) { + struct timeval timeout; + int rc; /* select() return code */ + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + switch(rc) { + case -1: + /* select error */ + break; + case 0: + default: + /* timeout or readable/writable sockets */ + curl_multi_perform(multi_handle, &still_running); + break; + } + } + + curl_multi_cleanup(multi_handle); + + curl_easy_cleanup(http_handle); + + return 0; +}