“编写正文和数据失败”libcurl c ++

时间:2014-01-10 11:02:52

标签: c++ curl libcurl

您好我正在尝试保存CURL服务器响应并收到以下错误: 我读到这是因为读取和写入文件的数据之间的大小不同,因此curl正在破碎。文件已创建并包含需要的XML数据但仍显示错误。谢谢你的帮助!!

  • 写入正文失败(0!= 96)

  • 写入数据失败

  • 关闭连接#0

这是我的cb函数:

static size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{  size_t written = fwrite(ptr, size, nmemb, stream); return written; }

和方法:

createJob(std :: string s,std :: string directory){

    static const char *fp = "resultcurl.xml";
    std::stringstream filepath;
filepath<< directory;
    filepath<< fp;

    std::string pagefilename = filepath.str();

FILE *pagefile;
    std::string job_id;

struct curl_slist *headers = NULL;

std::string jobXML = s;
curl = curl_easy_init();

if (curl) {

    headers = curl_slist_append(headers, "Accept: */*");
    headers = curl_slist_append(headers, "Content-Type: application/xml");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, true);

    curl_easy_setopt(curl, CURLOPT_URL,
            ".../jobs.xml");

    curl_easy_setopt(curl, CURLOPT_USERPWD, "...");

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jobXML.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(jobXML.c_str()));

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data);

            pagefile = fopen(pagefilename.c_str(), "wb");

       if (pagefile) {


            curl_easy_setopt(curl, CURLOPT_FILE, pagefile);

            //curl_easy_perform(curl);


          }

          res = curl_easy_perform(curl);

            /* cleanup curl stuff */ 
          curl_easy_cleanup(curl);

           //job_id =readXMLvalue(pagefilename);
          fclose(pagefile);
          return 0;

}

2 个答案:

答案 0 :(得分:2)

交换设置的顺序,

   pagefile = fopen(pagefilename.c_str(), "wb");
   if (pagefile) {
        curl_easy_setopt(curl, CURLOPT_FILE, pagefile);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data);
        ...
   }
   ...

答案 1 :(得分:0)

如果您只想将数据写入文件,Curl会为您完成。设置

if(curl_easy_setopt( curl , CURLOPT_WRITEDATA , (void *) fptr  ) != CURLE_OK)
{
    return(YOUR_ERR_CODE) ;
}

其中fptr是,

FILE *fptr = fopen( "emalware.127.5a6ceb78050f80e4c833dcc3764bf9dd.gzip", "wb" );
if( fptr == NULL )
{
   return -1;
}