libcurl使用和错误解决

文|Seraph

01 | libcurl安装

  1. 下载源码
  2. 执行如下命令
tar -zxvf curl-x.x.x.tar.gz
sudo ./configure
sudo make
sudo make install
  1. 添加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 | 问题解决

  1. undefined reference to 'curl_global_init'
    解决:编译命令加上-l curl,如gcc http.c -l curl -o http
  2. curl: error while loading shared libraries: libcurl.so.4: cannot open shared
    解决:将curl的lib库路径添加至LD_LIBRARY_PATH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值