簡體   English   中英

在C ++套接字連接中發送的奇怪行為

[英]Strange behavior of send in c++ socket connection

我正在嘗試使用c ++下的tcp套接字連接。 我想通過網絡發送std :: map對象的序列化(JSON)形式。 我發現在發送了一定數量的數據包(取決於數據包大小)之后,就無法再發送了。 我已經嘗試了curl lib和用於套接字連接的標准POSIX API:

  • 在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);
    }
}

如果對等方未讀取您正在發送的數據,則可能會發生這種情況。

數據包進入另一端的套接字的接收緩沖區,並將ACK發送回給您,因此一些數據被確認並從套接字的發送緩沖區中丟棄。 但是,如果對等方未從其接收緩沖區中提取數據,則它最終會變滿,並且您無法發送任何數據,除非該位置被釋放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM