gpt4 book ai didi

tcp - 类似 Nagle 的问题

转载 作者:可可西里 更新时间:2023-11-01 02:57:20 27 4
gpt4 key购买 nike

所以我有了这个实时游戏,C++ 服务器使用 SFML library 禁用了 nagle , 和客户端使用 asyncsocket , 也禁用nagle。我每 1 秒发送 30 个数据包。从客户端发送到服务器没有问题,但是当从服务器发送到客户端时,一些数据包正在迁移。例如,如果我在完全不同的数据包中发送“a”和“b”,客户端会将其读作“ab”。它只发生一次,但它在游戏中造成了一个真正的问题。

那我该怎么办呢?我该如何解决?也许这是服务器中的东西?也许操作系统设置?

需要说明的是:我没有使用 nagle,但我仍然遇到这个问题。我在客户端和服务器中都禁用了。

最佳答案

For example, if I'm sending "a" and "b" in completly different packets, the client reads it as "ab". It's happens just once a time, but it makes a real problem in the game.

我认为您忽略了 TCP 的基本性质:它是一种流协议(protocol),而不是数据包协议(protocol)。 TCP 既不尊重也不保留发送方的数据边界。换句话说,TCP 可以自由组合(或拆分!)您发送的“数据包”,并以任何需要的方式将它们呈现给接收方。 TCP 遵守的唯一限制是:如果传送了一个字节,它将以与发送时相同的顺序传送。 (Nagle 没有改变这一点。)

因此,如果您在服务器上两次调用send(或write),发送这六个字节:

"packet" 1: A B C
"packet" 2: D E F

您的客户端可能recv(或read)这些字节序列中的任何一个:

ABC / DEF
ABCDEF
AB / CD / EF

如果您的应用程序需要知道发送方的写入之间的边界,那么您有责任保存和传输该信息。

正如其他人所说,有很多方法可以解决这个问题。例如,您可以在每个信息量之后发送一个换行符。这就是(部分)HTTP、FTP 和 SMTP 的工作方式。

您可以将数据包长度与数据一起发送。其通用形式称为 TLV,代表“类型、长度、值”。发送一个固定长度的类型字段,一个固定长度的长度字段,然后是一个任意长度的值。这样您就知道何时读取了整个值并为下一个 TLV 做好了准备。

您可以安排您发送的每个数据包的长度都相同。

我想还有其他解决方案,我想您可以自己想出它们。但首先您必须认识到这一点:TCP 可以并将合并或破坏您的应用程序数据包。您可以依赖字节的传递顺序,但别无其他。

关于tcp - 类似 Nagle 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com