curl CURLOPT_WRITEDATA CURLOPT_WRITEFUNCTION 回調函數

最近用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");
    }

}

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