N*(连接 + 发送 + 关闭) vs (Nagle 禁用 + 连接 + N*发送 + 关闭) , N > 1
N*(connect + send + close) vs (Nagle disable + connect + N*send + close) , N > 1
我是套接字编程的新手(正如你已经通过我愚蠢的问题了解到的那样),但抛开我的羞耻感不谈,我正在使用TCP posix编写一个程序。我的限制如下:从客户端发送到服务器的消息应该以字节流的形式读取,虽然我的应用程序性能不高,但应该尽快发送消息。我编写了一个TCP客户端类,目的是执行以下操作:1个连接-多个发送-和1个在流式传输结束时关闭。问题是消息不能近乎实时地传递(我认为它在等待一个更大的包来更好吞吐量)在网上做了一些研究后,我发现虽然你可以禁用Nagle算法(NA),但这样做是一个非常糟糕的主意。由于我是套接字编程的新手,我不想禁用我不完全理解的功能。所以我只剩下两个(糟糕的?)选项:
- 每条消息连接-发送-关闭
- 1个连接-发送多次,并在NA禁用的情况下在最后关闭1个。当我读到禁用NA的后果时,在我看来,每次打开和关闭套接字只是为了发送消息也是一个昂贵的代价
有没有其他不留插座的解决方案?
谢谢。
在您的情况下,禁用Nagle正是您想要做的。
请记住,每次对write()的调用都会立即传输数据。因此,请确保将整个消息打包在一起,然后在准备发送时调用write()(或writev())一次;不要用较小的有效负载重复调用write(),因为这会很慢。
像你这样的情况正是他们让你禁用Nagle的原因。
@Nemo为TCP提供了很好的建议。
但我建议你看看UDP。TCP可以在数据包丢失期间引入任意延迟,而"TCP公平性"的工作原理是强迫数据包丢失。它不适合低延迟传输。想要禁用Nagle是你使用错误协议的有力迹象。
相关文章:
- 从命令行c++发送文本文件名
- 关闭||运算符优化
- 发送一个带有libcurl C++问题的帖子请求:s
- C++在变量给定的指定时间内关闭电脑
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C++中将函数发送到另一个进程
- C++ WebSocket 帧发送会导致服务器关闭连接
- 如果我在关闭套接字之前没有发送IP_DROP_MEMBERSHIP会怎样?
- 在服务器关闭的TCP连接上发送数据时的行为不一致
- 客户端在关闭(SHUT_WR)后将RST发送到收到的数据包
- 在多线程HTTP服务器中发送后,如何干净地关闭套接字
- 非阻塞关闭 - 如何确保数据已发送
- TCP套接字:在发送之前检测对等方是否已关闭?(Linux)
- 插座在关闭时可以发送信号吗?
- Java -> C++ TCP 套接字直到关闭才发送
- 关闭套接字而不等待发送成功-Winsock2非阻塞TCP套接字
- CEF框架在关闭前发送http请求
- 在连接关闭后发送HTTP POST/GET
- C++应用程序只有在关闭时才以串行方式发送数据
- N*(连接 + 发送 + 关闭) vs (Nagle 禁用 + 连接 + N*发送 + 关闭) , N > 1