文|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
。