如何解决你如何使用 c++ 从 libcURL 获取响应头
好的,所以基本上我想要在我发送我的帖子请求后的响应头。
这是我的发送邮政编码
pDataInfo->recvHeadBuff = (char*)VirtualAlloc(NULL,4096,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
InitPost(pDataInfo);
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,5L);
curl_easy_setopt(curl,CURLOPT_URL,pDataInfo->URL);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,pDataInfo->PostData.c_str());
curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,header_callback);
curl_easy_setopt(curl,CURLOPT_HEADERDATA,pDataInfo->recvHeadBuff);
curl_easy_perform(curl);
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&pDataInfo->repCode);
k 所以我正在尝试创建一个缓冲区,我将用于我的用户数据*
回调函数:
static size_t header_callback(char* buffer,size_t size,size_t nitems,void* userdata)
{
strcpy((char*)userdata,buffer);
std::cout << (char*)userdata; // This prints the headers correctly
return nitems * size;
}
现在我认为我的缓冲区将填充来自标题缓冲区的字符,但是当我尝试从该回调函数外部再次计算缓冲区时,我什么也得不到。
基本上需要帮助,以使用用户数据和缓冲区从这个函数中获取我的变量,它是 noobxd。
解决方法
您的 CURLOPT_HEADERFUNCTION
回调假设所提供的 buffer
以 null 结尾,但事实并非如此。 documentation 甚至这样说:
libcurl 收到头数据后立即调用此函数。标题回调将为每个标题调用一次,并且只有完整的标题行会传递给回调。使用它解析标头非常容易。 buffer
指向传递的数据,该数据的大小为 nitems
; size
始终为 1。不要假设标题行以空字符结尾!
您还假设完整标头将适合您分配的 4K recvHeadBuff
,但这也不能保证,因此您面临缓冲区溢出的风险。
尝试更像这样的事情:
std::string headers;
InitPost(pDataInfo);
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,5L);
curl_easy_setopt(curl,CURLOPT_URL,pDataInfo->URL);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,pDataInfo->PostData.c_str());
curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,header_callback);
curl_easy_setopt(curl,CURLOPT_HEADERDATA,&headers);
curl_easy_perform(curl);
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&pDataInfo->repCode);
// use headers as needed...
DWORD size = (headers.size() + 1) * sizeof(char);
pDataInfo->recvHeadBuff = (char*) VirtualAlloc(NULL,size,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
if (pDataInfo->recvHeadBuff)
CopyMemory(pDataInfo->recvHeadBuff,headers.c_str(),size);
...
static size_t header_callback(char* buffer,size_t size,size_t nitems,void* userdata)
{
std::string *headers = (std::string*) userdata;
headers->append(buffer,nitems * size);
return nitems * size;
}
或者,您应该将 pDataInfo->recvHeadBuff
更改为使用 pDataInfo->PostData
使用的相同字符串类型(我假设为 std::string
)而不是 char*
,然后你可以这样做:
InitPost(pDataInfo);
curl_easy_setopt(curl,&(pDataInfo->recvHeaders));
curl_easy_perform(curl);
curl_easy_getinfo(curl,&pDataInfo->repCode);
...
static size_t header_callback(char* buffer,nitems * size);
return nitems * size;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。