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

猜你喜欢

转载自blog.csdn.net/pengshuyes/article/details/105531166
今日推荐