好的,基本上,在发送post请求之后,我需要响应头。
这是我的邮编
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);就在这里,我试图创建一个缓冲区,用于我的用户数据*
回调功能:
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;
}现在,我认为我的缓冲区将被来自头缓冲区的字符填充,但是当我试图从这个回调函数之外再次显示缓冲区时,我什么也得不到。
基本上需要帮助才能使用userdata和缓冲区来从这个函数中提取变量,比如noobxd。
发布于 2021-03-16 18:11:20
您的CURLOPT_HEADERFUNCTION回调假设提供的buffer为空终止,但它不是。文档甚至这么说:
这个函数一收到头数据就会被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, 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->recvHeaders));
curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &pDataInfo->repCode);
...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;
}https://stackoverflow.com/questions/66659641
复制相似问题