【发布时间】:2014-01-07 22:57:43
【问题描述】:
我正在编写向服务器发送 POST 请求并从中获取答案的程序。 (使用 curl 库)(OS Linux、Red Hat Linux 3.2.2.-5)。有时我看到,来自服务器的响应仅包含消息的第二部分。 (我打印 _sResponse 有时我会看到完整的消息(更频繁),有时会看到损坏的消息(只有最后一部分)。
Class CurlSoapHandler
{
……..
static std::string _sResponse;
static std::string GetResponse() {return _sResponse;}
static size_t write_data(char *ptr, size_t size, size_t count, std::string *buffer)
{
int result = 0;
if (buffer != NULL)
{
std::string tmp_buffer(ptr, size * count);
_sResponse = tmp_buffer;
result = size * count;
}
else
{
std::cout<<"Buffer is not OK!"<<std::endl;
}
return result;
}
};
void CurlSoapHandler::DoRequest(const std::string& sRequest, std::string& sResponse)
{
CURL* _CURL;
CURLcode res;
struct curl_slist *headerlist=NULL;
headerlist = curl_slist_append(headerlist, "Content-Type:text/xml");
curl_global_init(CURL_GLOBAL_ALL);
_CURL = curl_easy_init();
if(_CURL)
{
curl_easy_setopt( _CURL, CURLOPT_URL, ttp://10.10.10.11:8083/Server/Server.asmx);
curl_easy_setopt( _CURL, CURLOPT_USERPWD, "user@password");
curl_easy_setopt( _CURL, CURLOPT_POSTFIELDS, sRequest.c_str());
curl_easy_setopt( _CURL, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt( _CURL, CURLOPT_TIMEOUT, 20);
curl_easy_setopt( _CURL, CURLOPT_WRITEFUNCTION, CurlSoapHandler::write_data);
res = curl_easy_perform(_CURL);
sResponse = GetResponse();
if(res != CURLE_OK)
{
std::cerr<<"CURL message: "<<curl_easy_strerror(res)<<std::endl;
}
curl_easy_cleanup(_CURL);
}
else
{
std::cout<<"Curl initialization problem!"<<std::endl;
}
curl_global_cleanup();
curl_slist_free_all (headerlist);
}
我不知道它为什么会发生。有人有想法吗? (例如,可能需要设置一些 curl 选项)。我如何确定它的原因并了解它是否是我的应用程序的问题。我使用 tcpdump 实用程序捕获了流量(我在我的虚拟机 (VMWARe) 上运行它)并在转储中看到了完整的消息。所以,我认为服务器发送了正确的响应。提前致谢!
【问题讨论】:
-
你需要在你的write函数中积累数据。对于同一个请求,它会被多次调用。
-
非常感谢您的帮助!但我不明白如何在我的代码中实现它。
-
创建一个请求类,在一个类中有
std::string result成员。使您的 write 函数成为该类的方法。每次调用时,请执行result += buffer。 -
非常感谢!所以,我应该为一个请求调用两次 write 函数,对吗?
-
我现在调用了两次,在我看来问题已经消失了。