最近用libcurl開源庫做了一個項目,關於接收請求返回數據的回調函數,是我的一點想法。
1,curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpPostWriteBack);
HttpPostWriteBack是回調函數指針,需要自己實現原型爲:unsigned int HttpPostWriteBack(void *contents, size_t size, size_t nmemb, void *userp)
1)contents:返回數據指針;2)size:每一塊大小;3)nmemb:塊數;4)userp:出參數據,若想傳出http返回數據,這是途徑。
2,curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
chunk:回調函數的第四個參數,用來保存返回數據。
下面是一次完整請求的curl請求
struct MemoryStruct {
char *memory;
size_t size;
};//聲明一個結構體
unsigned int HttpPostWriteBack(void *contents, size_t size, size_t nmemb, void *userp)
{//回調函數實現:一次請求可能多次調回調函數
size_t realsize = size * nmemb;//一次回調返回的數據量
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize);
if (ptr == NULL) {
/* out of memory! */
LogOut("not enough memory (realloc returned NULL)\n");
return 0;
}
LogOut("chunk realloc success\n");
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
LogOut("callback mem->size :%d\n",mem->size);
return realsize;//必須返回真實的數據
}
int Serve_Http_Post(....)
{
struct MemoryStruct chunk;
chunk.memory = malloc(1);
chunk.size = 0;
......
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpPostWriteBack);
.......
curl_easy_perform(curl);
............chunk.memory已經有數據
if (chunk.memory)
{
free(chunk.memory);
chunk.memory = NULL;
LogOut("chunk Free\n");
}
}