0

以下のコードは、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;
}
4

1 に答える 1

4

エラーは、関数から正しい値を返していないことです。実際には何も返していません。

また、関数に提供されるデータは、実際には最初のptr引数です。


ドキュメントがあまり明確ではないことに同意しますが、次のように述べています。

ptr指すデータのサイズは、 sizeにnmembを掛けたものであり、ゼロで終了することはありません。

上記の行 (私の強調) はptr、ドキュメントで提供されている関数宣言の最初の引数にデータがあることを示しています。

ドキュメントには次のようにも記載されています。

実際に処理されたバイト数を返します。その量が関数に渡された量と異なる場合、ライブラリにエラーが通知されます。これにより、転送が中止され、 が返されCURLE_WRITE_ERRORます。

関数から値を返さないため、未定義の動作が発生し、一見ランダムな値が返され、操作全体が失敗します。これを修正するには、 を返す必要がありますsize * count

また、文字列を出力するためにも使用sizeします。これは、使用される基になる型のサイズです (おそらく1)。count変数は、CURL によって読み取られる文字数です。(データが終了していないため)未定義の動作を呼び出さずに完全に機能させるには、次のように呼び出す必要がありますprintf

printf("%*.*s", size * count, size * count, ptr);
于 2013-05-14T13:12:02.803 に答える