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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章