服务器实现POST请求时的响应字符串不完整

时间:2013-12-19 11:30:36

标签: c++ linux curl

我正在编写将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);
     }

我不知道为什么会这样。有人有想法吗? (例如,可能需要设置一些卷曲选项)。如何确定原因并了解它是否与我的应用程序有关。我使用tcpdump实用程序捕获流量(我在我的虚拟机(VMWARe)上运行它)并在转储中看到完整的消息。所以,我认为服务器发送正确的响应。提前谢谢!

1 个答案:

答案 0 :(得分:0)

只需将_sResponse = tmp_buffer;替换为_sResponse += tmp_buffer;即可。