文|Seraph
01 | libcurl安装
- 下载源码
- 执行如下命令
tar -zxvf curl-x.x.x.tar.gz
sudo ./configure
sudo make
sudo make install
- 添加lib路径到
LD_LIBRARY_PATH
中。(库一般在/usr/local/lib目录下)
02 | 多次调用CURLOPT_WRITEFUNCTION回调函数的问题解决
在与HTTP服务进行交互时,发现post一次数据时,可能会多次调用回调函数,而且这个次数是不定的。从而导致我传一个指针时,获得到的是最后一个回调函数返回的数据。
原始回调函数代码如下:
static size_t cb(void *data, size_t size, size_t nmemb, void **userp)
{
size_t realsize = size * nmemb;
char **mem = (char **)userp;
char *ptr = (char*)malloc(realsize + 1);
if(ptr == NULL)
return 0; /* out of memory! */
*mem = ptr;
memcpy(*mem, data, realsize);
(*mem)[realsize] = '\0';
return realsize;
}
修改后代码如下:(注意,这块使用的时候,传入的指针一定要为NULL,因为多次执行回调函数时,是通过判别指针不为空的时候进行连接数据的。)
static size_t cb(void *data, size_t size, size_t nmemb, void **userp)
{
size_t realsize = size * nmemb;
char **mem = (char **)userp;
size_t shift = 0;
if(*mem)
{
shift = strlen(*mem);
}
char *ptr = (char*)malloc(realsize + shift + 1);
if(ptr == NULL)
return 0; /* out of memory! */
if(*mem)
{
memcpy(ptr, *mem, shift);
free(*mem);
}
*mem = ptr;
memcpy(*mem + shift, data, realsize);
(*mem)[realsize + shift] = '\0';
return realsize;
}
以上代码,我都没用到realloc,因为我是很多线程会调用,一开始realloc会让一些post执行失败。后面改成malloc就ok了,不知道为什么。。。
99 | 问题解决
undefined reference to 'curl_global_init'
解决:编译命令加上-l curl
,如gcc http.c -l curl -o http
。curl: error while loading shared libraries: libcurl.so.4: cannot open shared
解决:将curl的lib库路径添加至LD_LIBRARY_PATH
。