0

httpを使用してファイルを送信するクライアントとサーバーがあり、tcpdumpを使用して、httpヘッダーを受信した後、サーバーがACKを送信するたびに、サーバーが2つのリセットパケットを受信し、パケットを正常に受信した後にリセットを受信することがわかりましたhttp コンテンツが含まれています。

サーバー側の tcpdump データのタイムラインは次のようになります。

01:10:01.553222------data:http header
01:10:01.553233----------ack

01:10:01.590075-----------reset
01:10:01.590103-----------reset

curl オプション設定コード:

    curl_easy_setopt(curl_obj, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_obj, CURLOPT_WRITEFUNCTION, WriteData); 
curl_easy_setopt(curl_obj, CURLOPT_WRITEDATA, &sbuf);  
curl_easy_setopt(curl_obj, CURLOPT_COOKIEFILE, "cookie");

curl_easy_setopt(curl_obj, CURLOPT_POST, 1L);
curl_easy_setopt(curl_obj, CURLOPT_READFUNCTION, ReadCallback);
curl_easy_setopt(curl_obj, CURLOPT_READDATA, this);
curl_easy_setopt(curl_obj, CURLOPT_POSTFIELDSIZE, block_size);


curl_easy_setopt(curl_obj, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(curl_obj, CURLOPT_PROGRESSFUNCTION, ProgressCallback);
curl_easy_setopt(curl_obj, CURLOPT_PROGRESSDATA, this)

それで、私が聞きたいのは、送信されたデータのACKを限られた時間内に受信しないときにtcpをリセットするためのタイムアウトを設定するためのlibcurlのオプションがいくつかあるということです。クライアントとサーバーが同じ都市にあり、インターネット接続が高速な場合、このシステムは正常に動作するため、ビジネス コードにバグはありません。

ps: curl は errorno 56 を返します

4

1 に答える 1

0

CURLOPT_SOCKOPTFUNCTIONCURLOPT_OPENSOCKETFUNCTIONなど、アプリケーションがソケットに直接アクセスできるようにする複数のコールバック オプションがあります。

しかし、この質問に対するコメント者のように、それがあなたの問題の実際の理由 (または解決策) であるとは思えません。

于 2013-01-02T18:40:20.790 に答える