[英]Strange behavior of send in c++ socket connection
我正在尝试使用c ++下的tcp套接字连接。 我想通过网络发送std :: map对象的序列化(JSON)形式。 我发现在发送了一定数量的数据包(取决于数据包大小)之后,就无法再发送了。 我已经尝试了curl lib和用于套接字连接的标准POSIX API:
在通信过程中,使用了相同的套接字连接。我想整个事情都与缓冲区大小有关,但是(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.