0

コードで libcurl を使用しており、curl_easy_perform() の最初の数回の試行で適切な値が返されますが、その後、最初の 800 バイトほどが削除されていることがわかります。ポインター write_data 関数は、最初の 800 バイト程度の後にストリームを指すように渡されます。

これが私が使用するコードのスニペットです-

ctx = curl_easy_init();
curl_easy_setopt(ctx, CURLOPT_POSTFIELDS, bodyData);
curl_easy_setopt(ctx, CURLOPT_URL, serverUrl);
curl_easy_setopt(ctx, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(ctx, CURLOPT_WRITEDATA, response);
res = curl_easy_perform(ctx);
curl_easy_cleanup(ctx);

編集:わかりましたので、一部のリクエストでは、1 つの curl_easy_perform() に対して write_data が 2 回呼び出されることがわかります。したがって、write_data は最初の x バイトを取得し、次に残りを読み取ります。しかし、私の write_data 関数は毎回応答ポインターをオーバーライドしています。応答ポインターに memcpy または連結する必要があるかどうかを知るにはどうすればよいですか? 状況を適切に説明できることを願っています。

ありがとう

P

4

2 に答える 2

3

大きなバッファー (「応答」ポインター) を提供する必要があり、write_data 関数が呼び出されるたびに、バッファーにさらにデータを追加します。応答ポインターは、おそらく次のような構造体を指す必要があります。

struct myStruct{
    char *buffer; /* remember to malloc this! */
    int size; /* 100000 */
    int used; /* initially 0 */
};
typedef struct myStruct myStruct;

次に、 write_data 関数へのすべてのエントリで、最後に書き込んだ位置の後に、提供されたデータをバッファーに memcpy します (write_data に提供されたバッファーは必ずしも null で終了するとは限らないことに注意してください)。

size_t write_data( char *ptr, size_t size, size_t nmemb, void *userdata)
{
    myStruct *parseBuf = (myStruct *)userdata;
    int total_size = size * nmemb;
    memcpy(parseBuf->buffer+parseBuf->used, ptr, total_size);
    parseBuf->used += total_size;
    *(parseBuf->buf+parseBuf->used) = 0; /* Add a null terminator on */
    return size * nmemb;
}

そのような何かがそれを行う必要があります。(免責事項:これをコンパイルしようとは思いませんでしたが、うまくいくはずです)

于 2012-06-07T20:00:56.573 に答える
0

CURLOPT_WRITEFUNCTIONコールバックは、1回の要求に対して、none、1回、またはMANY回呼び出されます。あなたの関数はそれを適切に処理する必要があります。

于 2012-06-07T17:44:32.043 に答える