我試圖為一個小專案實作一些 curl 和curlcpp函式。
到目前為止,我已經實作了一些功能,但現在我想添加功能。這個想法是將發送和接收的資料存盤在緩沖區中,以便稍后我可以訪問:
- 發送資料
- 發送標頭
- 接收資料
- 收到的標頭
我知道有 CURLOPT_WRITEFUNCTION 但這僅適用于回應資料,我也需要輸出資料/標頭。CURLOPT_DEBUGFUNCTION看起來對我有用,但我不能在 CPP 上配置它。
這是我班級的示例代碼:
class CurlCPPClient
{
private:
...
int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(this->trace_data);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
std::string frame_info(data);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
raw_data = frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
raw_data = frame_info;
break;
default:
break;
}
return 0;
}
將函式指標設定為 trace_data 時出現編譯器問題。我得到“錯誤 C3867”和“錯誤 C2228”:this->trace_data、this.trace_data、trace_data。如果我不使用 trace_data 作為我的類的方法,我可以呼叫它,但我不能保存成員的資訊以便稍后在類的另一部分訪問它。
uj5u.com熱心網友回復:
libcurl 的回呼需要獨立的 C 風格函式。您不能使用非靜態類方法進行回呼。
將您的trace_data()方法宣告為static。您可以使用將物件CURLOPT_DEBUGDATA的this指標傳遞CurlCPPClient給方法的userptr引數。
class CurlCPPClient
{
private:
...
static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
curl_easy.add<CURLOPT_DEBUGDATA>(this);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
CurlCPPClient *pThis = static_cast<CurlCPPClient*>(userptr);
std::string frame_info(data, size);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
pThis->raw_data = frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
pThis->raw_data = frame_info;
break;
default:
break;
}
return 0;
}
或者,使用CURLOPT_DEBUGDATA僅將raw_data成員傳遞給回呼:
class CurlCPPClient
{
private:
...
static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
curl::curl_easy curl_easy;
std::string raw_data;
public:
...
}
CurlCPPClient::CurlCPPClient()
{
curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
curl_easy.add<CURLOPT_DEBUGDATA>(&raw_data);
}
int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr)
{
std::string *pRawData = static_cast<std::string*>(userptr);
std::string frame_info(data, size);
switch(type)
{
case CURLINFO_HEADER_OUT:
case CURLINFO_DATA_OUT:
*pRawData = frame_info;
break;
case CURLINFO_HEADER_IN:
case CURLINFO_DATA_IN:
*pRawData = frame_info;
break;
default:
break;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/336820.html
