在c ++套接字连接中发送的奇怪行为

时间:2013-02-01 08:24:37

标签: c++ sockets curl tcp

我正在尝试使用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);
    }
}

1 个答案:

答案 0 :(得分:1)

如果对等方没有读取您要发送的数据,则可能发生这种情况。

数据包进入另一端套接字的接收缓冲区,并将ACK发送给您,因此会确认一些数据并从套接字发送缓冲区中丢弃。但是,如果对等方没有从其接收缓冲区中提取数据,它最终会变满,并且在某个地方被释放之前您无法发送任何数据。