首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类Nagle问题

类Nagle问题
EN

Stack Overflow用户
提问于 2011-07-07 17:21:43
回答 1查看 1.4K关注 0票数 0

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

那么我该怎么做呢?我该如何解决这个问题呢?也许是服务器里的什么东西?可能是操作系统设置?

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

EN

回答 1

Stack Overflow用户

发布于 2011-07-08 01:24:34

例如,如果我在完全不同的数据包中发送"a“和"b”,客户端将其读取为"ab“。这只发生了一次,但它在游戏中造成了真正的问题。

我认为您已经忘记了TCP的基本性质:它是流协议,而不是分组协议。TCP既不尊重也不保留发送者的数据边界。换句话说,TCP可以自由组合(或拆分!)你发送的“数据包”,并以任何它想要的方式将它们呈现在接收器上。TCP遵守的唯一限制是:如果发送一个字节,它将按照发送的相同顺序进行发送。( Nagle并没有改变这一点。)

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

代码语言:javascript
复制
"packet" 1: A B C
"packet" 2: D E F

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

代码语言:javascript
复制
ABC / DEF
ABCDEF
AB / CD / EF

如果您的应用程序需要知道发送者的write之间的边界,则您有责任保存和传输该信息。

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

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

你可以安排你发送的每个包的长度都是一样的。

我想还有其他的解决方案,我想你可以自己想出来。但首先,您必须认识到这一点: TCP可以并将合并或拆分您的应用程序数据包。您可以依赖于字节的传递顺序,但不能依赖于其他。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6608394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档