| _ _ _ _ |
| | (_) |__ ___ _ _ _ __| | |
| | | | '_ \ / __| | | | '__| | |
| | | | |_) | (__| |_| | | | | |
| |_|_|_.__/ \___|\__,_|_| |_| |
| |
| |
| How To Use Libcurl In Your Program: |
| (by Ralph Beckmann <rabe@uni-paderborn.de>) |
| |
| NOTE: If you plan to use libcurl.a in Threads under Linux, do not use the old |
| gcc-2.7.x because the function 'gethostbyname' seems not to be thread-safe, |
| that is to say an unavoidable SEGMENTATION FAULT might occur. |
| |
| |
| 1. a) In a C-Program: |
| #include "curl.h" |
| |
| b) In a C++-Program: |
| extern "C" { |
| #include "curl.h" |
| } |
| |
| 2. char *url="http://www.domain.com"; |
| curl_urlget (URGTAG_URL, url, |
| URGTAG_FLAGS, CONF_NOPROGRESS, |
| URGTAG_ERRORBUFFER, errorBuffer, |
| URGTAG_WRITEFUNCTION, (size_t (*)(void *, int, int, FILE |
| *))handle_data, |
| URGTAG_TIMEOUT, 30, /* or anything You want */ |
| ... |
| URGTAG_DONE); |
| |
| 3. size_t handle_data (const void *ptr, size_t size, size_t nitems, |
| FILE *stream) |
| { |
| (void)stream; /* stop complaining using g++ -Wall */ |
| if ((int)nitems <= 0) { |
| return (size_t)0; |
| } |
| fprintf(stdout, (char *)ptr); /* or do anything else with it */ |
| return nitems; |
| } |
| |
| 4. Compile Your Program with -I$(CURL_DIR)/include |
| |
| 5. Link Your Program together with $(CURL_DIR)/lib/libcurl.a |
| |
| Small Example of How To Use libcurl |
| |
| ---------------------------------------------------------------------- |
| /* Full example that uses libcurl.a to fetch web pages. */ |
| /* curlthreads.c */ |
| /* - Test-Program by Ralph Beckmann for using curl in POSIX-Threads */ |
| /* Change *url1 and *url2 to textual long and slow non-FRAMESET websites! */ |
| /* |
| 1. Compile with gcc or g++ as $(CC): |
| $(CC) -c -Wall -pedantic curlthreads.c -I$(CURL_DIR)/include |
| |
| 2. Link with: |
| - Linux: |
| $(CC) -o curlthreads curlthreads.o $(CURL_DIR)/lib/libcurl.a -lpthread |
| -lm |
| - Solaris: |
| $(CC) -o curlthreads curlthreads.o $(CURL_DIR)/lib/libcurl.a -lpthread |
| -lm -lsocket -lnsl |
| */ |
| |
| #include <pthread.h> |
| #include <stdio.h> |
| #ifdef __cplusplus |
| extern "C" { |
| #include "curl.h" |
| } |
| #else |
| #include "curl.h" |
| #endif |
| |
| size_t storedata (const void *ptr, size_t size, size_t nitems, FILE *stream) { |
| (void)ptr; (void)stream; /* just to stop g++ -Wall complaining */ |
| fprintf(stdout, "Thread #%i reads %i Bytes.\n", |
| (int)pthread_self(), (int)(nitems*size)); |
| return (nitems); |
| } |
| |
| void *urlfetcher(void *url) { |
| curl_urlget (URGTAG_URL, url, |
| URGTAG_FLAGS, CONF_NOPROGRESS | CONF_FAILONERROR, |
| URGTAG_WRITEFUNCTION, (size_t (*)(void *, int, int, FILE |
| *))storedata, |
| URGTAG_DONE); |
| return NULL; |
| } |
| |
| int main(void) { |
| char *url1="www.sun.com"; |
| char *url2="www.microsoft.com"; |
| |
| pthread_t thread_id1, thread_id2; |
| pthread_create(&thread_id1, NULL, urlfetcher, (void *)url1); |
| pthread_create(&thread_id2, NULL, urlfetcher, (void *)url2); |
| pthread_join(thread_id1, NULL); |
| pthread_join(thread_id2, NULL); |
| |
| fprintf(stdout, "Ready.\n"); |
| |
| return 0; |
| } |