嘿伙计们,我注意到当我发送一个完整的数据包(在缓冲区中收集数据并发送)时,它比逐字节发送数据包要慢得多。用这种方法做网游可以吗?
user187418
问问题
131 次
4 回答
1
听起来像是一个与唠叨相关的问题。
您必须禁用对延迟要求高的应用程序的唠叨。(参见 setsockopt、TCP_NODELAY)。
解释:
TCP 堆栈对于小块的行为有所不同,试图在生成 IP 数据报的过程中以奇怪的方式将它们组合起来。这是 J.Nagle 建议的性能优化(因此是 nagling)。请记住,启用 NODELAY 将使每次 send() 调用都成为内核模式转换,因此您可能希望通过内存复制自己将流打包成块,然后再将它们送入 send() 如果性能是您的问题是做。
于 2009-12-12T12:06:12.400 回答
0
我没有真正测量任何东西,我很确定它与发送数据而不是收集数据有关。我将 C# 用于服务器端,C++ 用于客户端,在服务器端我包装了带有 BinaryWriter 和 BinaryReader 的套接字,在客户端中,我只使用了 send 和 recv 来发送每个字节。
于 2009-12-12T11:59:18.277 回答
0
这听起来很奇怪。逐字节发送数据的开销要大得多。您的传输标头将远远超过有效负载!更不用说 O( n )send
调用(其中n是字节数)。
如果这就是你所经历的,那你就做错了。
于 2009-12-12T11:42:17.613 回答
0
我认为你需要定义你的测量点(你到底在测量什么)。顺便问一下,这是 TCP 还是 UDP?
无论如何,Winsock 有自己的内部缓冲区,您可以通过调用setsockopt对其进行修改。
于 2009-12-12T11:49:07.560 回答