109 строки
3.3 KiB
Plaintext
109 строки
3.3 KiB
Plaintext
_ _ _ _
|
|
| (_) |__ ___ _ _ _ __| |
|
|
| | | '_ \ / __| | | | '__| |
|
|
| | | |_) | (__| |_| | | | |
|
|
|_|_|_.__/ \___|\__,_|_| |_|
|
|
|
|
|
|
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;
|
|
}
|