Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c+中发送的奇怪行为+;插座连接 我正在实验C++下的TCP套接字连接。我想通过网络发送std::map对象的序列化(JSON)形式。我发现在发送了一定数量的数据包(这取决于数据包的大小)之后,再也不可能发送了。我已经尝试了用于套接字连接的curl lib和标准POSIX API: POSIXAPI中的发送:在发送约100个数据包后,它开始阻塞 curl:curl\u easy\u send似乎已执行,但服务器未收到新数据包_C++_Sockets_Curl_Tcp - Fatal编程技术网

c+中发送的奇怪行为+;插座连接 我正在实验C++下的TCP套接字连接。我想通过网络发送std::map对象的序列化(JSON)形式。我发现在发送了一定数量的数据包(这取决于数据包的大小)之后,再也不可能发送了。我已经尝试了用于套接字连接的curl lib和标准POSIX API: POSIXAPI中的发送:在发送约100个数据包后,它开始阻塞 curl:curl\u easy\u send似乎已执行,但服务器未收到新数据包

c+中发送的奇怪行为+;插座连接 我正在实验C++下的TCP套接字连接。我想通过网络发送std::map对象的序列化(JSON)形式。我发现在发送了一定数量的数据包(这取决于数据包的大小)之后,再也不可能发送了。我已经尝试了用于套接字连接的curl lib和标准POSIX API: POSIXAPI中的发送:在发送约100个数据包后,它开始阻塞 curl:curl\u easy\u send似乎已执行,但服务器未收到新数据包,c++,sockets,curl,tcp,C++,Sockets,Curl,Tcp,在通信过程中使用了相同的套接字连接。我猜整个过程都与缓冲区大小有关,但是(1)我增加了缓冲区大小,没有看到任何显著的影响(2)如果缓冲区当前已满,我预计在给定的时间后可以再次发送。在这种情况下,也许我遗漏了一些重要但愚蠢的选项或信息。所以我的问题是:服务器的配置是错误的还是我没有以正确的方式使用API 接收端: ListenerThread::ListenerThread() { curl = curl_easy_init(); if (curl != 0) {

在通信过程中使用了相同的套接字连接。我猜整个过程都与缓冲区大小有关,但是(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被发送回您,因此一些数据得到确认,并从套接字发送缓冲区中丢弃。但是,如果对等方没有从其接收缓冲区提取数据,它最终会变满,在释放某个位置之前,您无法发送任何数据。

在发送正常工作之前,所有数据包都会被接收。尝试在服务器和客户端程序上使用
strace
,您将看到正在发生的读/写/发送/接收系统调用。您还将看到,您被阻止的位置(可能还有原因)。