0

c++ で tcp ソケット接続を試しています。std::map オブジェクトのシリアル化 (JSON) 形式をネットワーク経由で送信したいと考えています。一定量のパケット (これはパケット サイズによって異なります) が送信されると、送信が不可能になることがわかりました。ソケット接続用に curl lib と標準 POSIX API の両方を試しました。

  • send in POSIX API: ~100 パケットが送信された後、ブロックを開始します
  • curl: curl_easy_send は実行されているようですが、サーバーは新しいパケットを受信しません

通信中は同じソケット接続が使用されます。すべてがバッファサイズに関連していると思いますが、(1)バッファサイズを増やしましたが、大きな影響は見られませんでした(2)その後、送信が再び可能になると予想しますバッファが現在いっぱいである場合、指定された時間。この状況では、重要だがばかげたオプションまたは情報が欠けている可能性があります。私の質問は、サーバーの構成が間違っているのでしょうか、それとも API を正しい方法で使用していないのでしょうか?

レシーバー側:

ListenerThread::ListenerThread() {
    curl = curl_easy_init();

    if (curl != 0) {
        curl_easy_setopt(curl, CURLOPT_URL, "...");
        curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
        res = curl_easy_perform(curl);
        res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd);

        if (res != 0) {
            printf("Error: %s\n", curl_easy_strerror(res));
        }
    }
}
...
void ListenerThread::run() {
    while (true) {
        char buf[2048];

        wait_on_socket(sockfd, 1, 60000L);
        res = curl_easy_recv(curl, buf, 2048, &iolen);

        if (CURLE_OK != res) {
            break;
        }

        nread = (curl_off_t) iolen;

        printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n", nread);
        printf("Buffer: %s\n", buf);
    }
}
4

1 に答える 1

1

送信しているデータをピアが読み取っていない場合に発生する可能性があります。

パケットはもう一方の端のソケットの受信バッファに入り、ACKが返送されるため、ある程度のデータが確認され、ソケット送信バッファから破棄されます。ただし、ピアが受信バッファからデータを抽出していない場合、ピアは最終的にいっぱいになり、どこかが解放されるまでデータを送信できません。

于 2013-02-01T08:36:26.060 に答える