使用libcurl 实现http并发调用
文件curl.cpp
#include <iostream>
#include <curl/curl.h>
using namespace std;
int main(int argc, char **argv)
{
curl_global_init(CURL_GLOBAL_WIN32);
CURLM *multi_handle = NULL;
CURL *easy_handle1 = NULL;
CURL *easy_handle2 = NULL;
extern size_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p);
extern size_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p);
FILE *fp_sina = fopen("sina.html", "ab+");
FILE *fp_sohu = fopen("sohu.html", "ab+");
multi_handle = curl_multi_init();
easy_handle1 = curl_easy_init();
curl_easy_setopt(easy_handle1, CURLOPT_URL, "http://www.sina.com.cn");
curl_easy_setopt(easy_handle1, CURLOPT_WRITEFUNCTION, &save_sina_page);
curl_easy_setopt(easy_handle1, CURLOPT_WRITEDATA, fp_sina);
easy_handle2 = curl_easy_init();
curl_easy_setopt(easy_handle2, CURLOPT_URL, "http://www.sohu.com");
curl_easy_setopt(easy_handle1, CURLOPT_WRITEDATA, fp_sina);
easy_handle2 = curl_easy_init();
curl_easy_setopt(easy_handle2, CURLOPT_URL, "http://www.sohu.com");
curl_easy_setopt(easy_handle2, CURLOPT_WRITEFUNCTION, &save_sohu_page);
curl_easy_setopt(easy_handle2, CURLOPT_WRITEDATA, fp_sohu);
curl_multi_add_handle(multi_handle, easy_handle1);
curl_multi_add_handle(multi_handle, easy_handle2);
int running_handle_count;
while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &running_handle_count))
{
cout << running_handle_count << endl;
}
while (running_handle_count)
{
timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
int max_fd;
fd_set fd_read;
fd_set fd_write;
fd_set fd_except;
FD_ZERO(&fd_read);
FD_ZERO(&fd_write);
FD_ZERO(&fd_except);
curl_multi_fdset(multi_handle, &fd_read, &fd_write, &fd_except, &max_fd);
int return_code = select(max_fd + 1, &fd_read, &fd_write, &fd_except, &tv);
if (-1 == return_code)
{
cerr << "select error." << endl;
break;
}
else
{
while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &running_handle_count))
{
cout << running_handle_count << endl;
}
}
}
fclose(fp_sina);
fclose(fp_sohu);
curl_easy_cleanup(easy_handle1);
curl_easy_cleanup(easy_handle2);
curl_multi_cleanup(multi_handle);
curl_global_cleanup();
return 0;
}
size_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p)
{
return fwrite(buffer, size, count, (FILE *)user_p);
}
size_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p)
{
return fwrite(buffer, size, count, (FILE *)user_p);
}
编译时报错:
map_~/tutor/c/curl$ g++ curl.cpp
/tmp/cca41s3c.o: In function `main':
curl.cpp:(.text+0x1f): undefined reference to `curl_global_init'
curl.cpp:(.text+0x62): undefined reference to `curl_multi_init'
curl.cpp:(.text+0x6b): undefined reference to `curl_easy_init'
curl.cpp:(.text+0x8a): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0xa5): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0xbf): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0xc4): undefined reference to `curl_easy_init'
curl.cpp:(.text+0xe3): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0xfe): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0x118): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0x12b): undefined reference to `curl_multi_add_handle'
curl.cpp:(.text+0x13e): undefined reference to `curl_multi_add_handle'
curl.cpp:(.text+0x16f): undefined reference to `curl_multi_perform'
curl.cpp:(.text+0x228): undefined reference to `curl_multi_fdset'
curl.cpp:(.text+0x2aa): undefined reference to `curl_multi_perform'
curl.cpp:(.text+0x2e8): undefined reference to `curl_easy_cleanup'
curl.cpp:(.text+0x2f4): undefined reference to `curl_easy_cleanup'
curl.cpp:(.text+0x300): undefined reference to `curl_multi_cleanup'
curl.cpp:(.text+0x305): undefined reference to `curl_global_cleanup'
collect2: ld 返回 1
需要加 -l curl
map_~/tutor/c/curl$ g++ curl.cpp -l curl