最近要用C++读取一个web页面,然后解析出其中的值,想要一个像java中HTTPCLIENT。因为很多人推荐,所以我用了curl,用C写的,自然要考虑与C++的混合。
一. 安装
ubuntu下 sudo apt-get install libcurl4-openssl-dev
或者到http://curl.haxx.se/选择适合的平台版本来make
二. 例子
curl的关键是四个函数:
1. curl_easy_init初始化,相当于C++中的构造函数,初始化实例
2.curl_easy_setopt,设置参数,具体见文档
3.curl_easy_perform,执行opt所定义的操作
4.curl_easy_cleanup,释放,相当于C++中的析构函数
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <stdint.h>
uint64_t n_req;
uint64_t proc_time;
/* buf 是缓冲区,大小由size * nmemb指定,stream是调用是传入的参数,可以由curl_easy_setopt(curl, CURL_WRIDATA, &data)指定。*/
size_t resolve(void *buf, size_t size, size_t nmemb, void *stream) {
n_req = 0;
proc_time = 0;
char * p = (char*) buf;
size_t pos = 0;
size_t len = size * nmemb;
while ((' ' != *p) && pos != len ) {
n_req = n_req * 10 + (*p - '0');
p++;
pos++;
}
while ((*p < '0' || *p > '9') && pos != len) {
p++;
pos++;
}
while (pos < len) {
proc_time = proc_time * 10 + (*p - '0');
p++;
pos++;
}
printf("request count:%lld, process_time:%lld\n", n_req, proc_time);
return 0;
}
int
main(int argc, char* argv[]) {
CURL *curl;
CURLcode res;
if (argc != 2) {
printf("Usage: mycurl <url>\n");
exit(1);
}
curl = curl_easy_init();
if (curl == NULL) {
printf("curl init error\n");
exit(1);
}
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, resolve);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
return 0;
}
编译gcc -o test src.c -lcurl
三. 与C++混合
由于curl.h中已经定义了extern"C",所以直接#include<curl/curl.h>,编译时加上-lcurl。注意链接库-l**都要放在所有源文件的最后。
参考资料
1curl文档http://curl.haxx.se/docs/
2curl简单例子http://blog.csdn.net/mr_von/article/details/3326728
3为什么要extern "C" http://baike.baidu.com/view/2814224.htm