C++ &引用;不合格的书写体“;CURLOPT_WRITEDATA

C++ &引用;不合格的书写体“;CURLOPT_WRITEDATA,c++,c,curl,wsdl,libcurl,C++,C,Curl,Wsdl,Libcurl,下面的代码是使用wsdl从服务器获取响应,这里的问题是curl返回响应,但我无法打印它 错误: 失败的书写体 写入数据失败 #include<stdio.h> #include<string.h> #include"../include/curl.h" size_t write_data(void *ptr, size_t size, size_t count, void *stream) { /* ptr - your string variable.

下面的代码是使用wsdl从服务器获取响应,这里的问题是curl返回响应,但我无法打印它

错误:

失败的书写体 写入数据失败

#include<stdio.h>
#include<string.h>
#include"../include/curl.h"

size_t write_data(void *ptr, size_t size, size_t count, void *stream)
{
      /* ptr - your string variable.
      stream - data chuck you received */

     printf("%.*s", size, (char*)stream);
}


int main()
{
    int res=0,i=0;
    char buffer[4098]="",buff[128]="",buf[256]="",buf7[30]="",buf6[30]="",buf5[30]="";
    char machineid[]="SUBANI";
    char filename1[50]="";
    int refno=0,paymode=0,taxtype=0;
    FILE *fbc;

    memset(filename1,0,sizeof(filename1));
    sprintf(filename1,"/mnt/jffs2/Response_Details1.xml");
    lk_dispclr();
    lk_disptext(1,0,(unsigned char *)"Sending Request",0);
    lk_disptext(2,0,(unsigned char *)"Please Wait",0);
    memset(buffer,0,sizeof(buffer));

    sprintf(buffer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
                        <soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:log=\"http://wsdlclassess.application.sims.test.com\">\
                        <soap:Header>\
                        </soap:Header>\
                        <soap:Body>\
                        <log:loginMethod>\
                        <log:loginid>%s</log:loginid>\
                        <log:password>%s</log:password>\
                        </log:loginMethod>\
                        </soap:Body>\
                        </soap:Envelope>","raja","test");


    res=GET_FILE1(buffer,filename1);


    return 0;
}


int GET_FILE1(char *buffer,char *filename)
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;
    FILE *out_fd = (FILE *) 0;
    char errorbuf[300] = "",tmpbuff[128]="";
    char errmsg[256];
    int Timeout=120;   //Default timeout is = 2 mins
    int buffer_size = 0;
    char urlbuff[256]="";
    char mstr[10240];

    memset(urlbuff,0,sizeof(urlbuff));
        memset(tmpbuff,0,sizeof(tmpbuff));
    buffer_size = strlen(buffer);
         strcpy(tmpbuff,"http://10.10.1.111:8081/test_server/services/application?wsdl");
             tmpbuff[strlen(tmpbuff)]='\0';
    curl = curl_easy_init();
    if(curl)
    {
        out_fd = fopen (filename, "w");
        curl_easy_setopt(curl, CURLOPT_FILE, out_fd);
        printf("%s:Sign-In Request\n", __func__);
        headers = curl_slist_append(headers, "Content-type:application/soap+xml; charset=utf-8; action=\"http://wsdlclassess.application.sims.test.com/loginMethod\"");

        curl_easy_setopt(curl, CURLOPT_URL, tmpbuff);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, mstr);


        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, buffer_size);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, Timeout);
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER,errmsg);

        printf("The Server%s:Performing Transaction.....\n",__func__);
        res = curl_easy_perform(curl);
        printf("res=after culreasey perform%d\n",res);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        printf("\nerrorbuf:%s\n",errmsg);
        fclose(out_fd);
        if(CURLE_OK != res)
        {
            puts("error occured is\n" );
            //ppp_close();
            return -1;
        }
    }

    return 0;
}
#包括
#包括
#包括“./include/curl.h”
大小写入数据(void*ptr、大小大小、大小计数、void*stream)
{
/*ptr-字符串变量。
流-您收到的数据*/
printf(“%s”,大小,(字符*)流);
}
int main()
{
int res=0,i=0;
字符缓冲区[4098]=“”,buff[128]=“”,buf[256]=“”,buf7[30]=“”,buf6[30]=“”,buf5[30]=“”;
char machineid[]=“SUBANI”;
char filename1[50]=“”;
int refno=0,paymode=0,taxtype=0;
文件*fbc;
memset(filename1,0,sizeof(filename1));
sprintf(filename1,“/mnt/jffs2/Response_Details1.xml”);
lk_dispclr();
lk_disptext(1,0,(未签名字符*)“发送请求”,0);
lk_disptext(2,0,(未签名字符*)“请稍候”,0);
memset(buffer,0,sizeof(buffer));
sprintf(缓冲区,“\
\
\
\
\
\
%\
%\
\
\
","拉贾","测试",;
res=GET_FILE1(缓冲区,filename1);
返回0;
}
int GET_FILE1(字符*缓冲区,字符*文件名)
{
卷曲*卷曲;
卷曲编码;
struct curl_slist*headers=NULL;
文件*out_fd=(文件*)0;
charerrorbuf[300]=“”,tmpbuff[128]=“”;
char errmsg[256];
int Timeout=120;//默认超时为=2分钟
int buffer_size=0;
char urlbuff[256]=“”;
char-mstr[10240];
memset(urlbuff,0,sizeof(urlbuff));
memset(tmpbuff,0,sizeof(tmpbuff));
缓冲区大小=strlen(缓冲区);
strcpy(tmpbuff,“http://10.10.1.111:8081/test_server/services/application?wsdl");
tmpbuff[strlen(tmpbuff)]='\0';
curl=curl_easy_init();
if(curl)
{
out_fd=fopen(文件名,“w”);
curl_easy_setopt(curl,CURLOPT_文件,out_fd);
printf(“%s:登录请求\n”,\uuuu func\uuuu);
headers=curl\u slist\u append(headers,“内容类型:application/soap+xml;charset=utf-8;action=\”http://wsdlclassess.application.sims.test.com/loginMethod\"");
curl_easy_setopt(curl,CURLOPT_URL,tmpbuff);
curl\u easy\u setopt(curl,CURLOPT\u NOPROGRESS,0);
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,write\u data);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,mstr);
curl_easy_setopt(curl、CURLOPT_POSTFIELDSIZE、buffer_size);
curl\u easy\u setopt(curl、CURLOPT\u POSTFIELDS、buffer);
卷曲度(卷曲度,卷曲度(1L));
curl\u easy\u setopt(curl,CURLOPT\u超时,超时);
curl\u easy\u setopt(curl,CURLOPT\u ERRORBUFFER,errmsg);
printf(“服务器%s:正在执行事务…”\n“,\uuu func\uuuu”);
res=旋度(curl)\u容易执行(curl);
printf(“res=在culreasey之后执行%d\n”,res);
卷曲/滑动/自由/全部(标题);
旋度\轻松\清洁(旋度);
printf(“\nerrorbuf:%s\n”,errmsg);
fclose(out_fd);
如果(卷曲OK!=分辨率)
{
puts(“发生的错误为\n”);
//ppp_close();
返回-1;
}
}
返回0;
}

错误在于没有从函数返回正确的值,事实上没有返回任何内容

此外,提供给函数的数据实际上是第一个
ptr
参数


我同意这个问题不是很清楚,但它说:

ptr指向的数据的大小是大小乘以nmemb,它不会以零结尾

上面的一行(我的重点)告诉您数据在
ptr
中,这是文档中提供的函数声明中的第一个参数

文件还指出:

返回实际处理的字节数。如果该数量与传递给函数的数量不同,它将向库发出错误信号。这将中止传输并返回
CURLE\u WRITE\u错误

您不从函数返回值,因此您有未定义的行为,返回的值看似随机,导致整个操作失败。要解决此问题,应返回
size*count

您还可以使用
size
打印字符串,该字符串是所用基础类型的大小(可能是
1
),您的
count
变量是CURL读取的字符数。要完全工作,而不调用更多未定义的行为(因为数据没有终止),您应该调用
printf
如下:

printf("%*.*s", size * count, size * count, ptr);

错误在于没有从函数返回正确的值,事实上没有返回任何内容

此外,提供给函数的数据实际上是第一个
ptr
参数


我同意这个问题不是很清楚,但它说:

ptr指向的数据的大小是大小乘以nmemb,它不会以零结尾

上面的一行(我的重点)告诉您数据在
ptr
中,这是文档中提供的函数声明中的第一个参数

文件还指出:

返回实际处理的字节数。如果该数量与传递给函数的数量不同,它将向库发出错误信号。这将中止传输并返回
CURLE\u WRITE\u错误

您不从函数返回值,因此您有未定义的行为,返回的值看似随机,导致整个操作失败。要解决此问题,应返回
size*count

您还可以使用
size
打印字符串,该字符串是所用基础类型的大小(