Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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++ I';我使用tcp进行很多小的发送,我应该关闭Nagles算法吗?(人们也称之为TCP_NODELAY)_C++_Linux_Tcp_Linux Kernel_Send - Fatal编程技术网

C++ I';我使用tcp进行很多小的发送,我应该关闭Nagles算法吗?(人们也称之为TCP_NODELAY)

C++ I';我使用tcp进行很多小的发送,我应该关闭Nagles算法吗?(人们也称之为TCP_NODELAY),c++,linux,tcp,linux-kernel,send,C++,Linux,Tcp,Linux Kernel,Send,我重新制作这篇文章是因为我的标题选择太糟糕了,对此我很抱歉。我的新帖子可以在这里找到: 非常感谢大家。问题是,客户端实际上是机器人,它们从不从连接中读取数据。(感觉很愚蠢)Nagle不会导致“消失在内核中”,这就是为什么禁用它对您没有帮助。Nagle只会将数据缓冲一段时间,但最终会在用户没有任何提示的情况下发送数据 还有其他的罪魁祸首 编辑更新的问题 您必须确保客户端正在接收所有发送的数据,并且它正在快速接收数据。让每个客户机写入日志或要验证的内容 例如,如果客户机正在等待服务器接受其23字节

我重新制作这篇文章是因为我的标题选择太糟糕了,对此我很抱歉。我的新帖子可以在这里找到:

非常感谢大家。问题是,客户端实际上是机器人,它们从不从连接中读取数据。(感觉很愚蠢)

Nagle不会导致“消失在内核中”,这就是为什么禁用它对您没有帮助。Nagle只会将数据缓冲一段时间,但最终会在用户没有任何提示的情况下发送数据

还有其他的罪魁祸首


编辑更新的问题

您必须确保客户端正在接收所有发送的数据,并且它正在快速接收数据。让每个客户机写入日志或要验证的内容

例如,如果客户机正在等待服务器接受其23字节的更新,那么它可能没有收到数据。这可能会导致服务器的发送缓冲区填满,这将导致降级和最终死锁


如果这确实是罪魁祸首,那么解决方案将是一些异步通信,如Boost的Asio库。

TCP\u节点延迟
可能有助于减少发送端到接收端的小包延迟,但您给出的描述指向不同的方向。我可以想象如下:

  • 发送的数据比接收者实际消耗的数据多——这最终会溢出发送者的缓冲区(),并导致服务器进程在系统调用中出现“卡住”。此时,内核等待另一端确认一些未完成的数据,但接收方并不期望它,因此它不希望

可能还有其他解释,但如果不看代码就很难判断。

如果
send()
在TCP套接字上阻塞,则表示发送缓冲区已满,这反过来表明连接另一端的对等方读取数据的速度不够快。可能该客户端完全卡住了,没有足够频繁地调用
recv()

是的,我就是这么想的。不过我真的没有线索。我一直在关注的是tcp缓冲区大小可能。。。我真的不知道--@returneax您可以修改您的问题,以包括您用于在客户端和服务器上发送/接收数据的代码吗?我想知道你是否在做什么导致死锁等。当然,客户端是用C#编写的,我的朋友正在编写,但现在我可以给你服务器代码。服务器也是多线程的……不过多线程相当简单。两个线程通过消息队列进行通信。第一个线程只是监听3500端口上的新连接。然后验证他们的用户名和密码,创建一个客户端对象并填写其数据,然后通过消息队列将指向该对象的指针作为字节数组传递。因此,虽然没有人连接,但登录线程在accept()上被阻塞。@return我更新了我的答案,但现在我看到Nikolai击败了我。嗨,Nikolai,我知道一个事实,客户端从未读取数据。客户端正在被另一个程序模拟。如果他们从未收到数据,这会导致我自己的缓冲区溢出吗?再想想,UDP可能更适合你的需要。你知道,你可以简单地编辑你的标题。哈哈,我试过了,但我想不出来。。我更愿意:/。