c - 在 C 中非常快速地发送多个包

标签 c sockets protocols multiplayer

我正在尝试用 c 编写多人游戏,但是当我从服务器向客户端发送诸如“ARV 2\n\0”和“POS 2 0 0\n\0”之类的多个包时(通过发送()), 当我尝试用 recv() 读取它们时,他只发现了 1 个包,似乎是 1.. 中的 2 个包。

所以我想问,这正常吗?如果是,我怎么能强制我的客户逐一阅读包裹? (或者如果问题来自调用发送,我的服务器将一对一地发送给他们)

谢谢!

最佳答案

简短回答:是的,这是正常的。我假设您正在使用 TCP/IP。它是一个字节流协议(protocol),没有“数据包”。两端的网络和操作系统可能会以适合某些缓冲区或网络部分的任何方式组合和拆分您发送的数据。唯一可以保证的是,您会以相同的顺序获得相同的字节。

您需要使用自己的数据包框架。对于文本协议(protocol),使用例如 '\0' 字节或换行符分隔数据包。另请注意,网络或操作系统可能会在每次“读​​取”时为您提供部分数据包,因此您也需要在代码中处理它。如果数据包分隔符是单字节,这是最简单的。

特别是对于没有“未使用”字节值来标记数据包边界的二进制协议(protocol),您可以将数据包的长度写为二进制数据,然后是那么多数据字节,然后是长度、数据,等等。请注意,即使在长度信息的中间,数据流也可能被拆分为不同的“读取”调用(除非长度是单字节),因此您可能需要多几行代码来处理接收拆分数据包。


另一种选择是使用 UDP 协议(protocol),它确实会发送数据包。但是 UDP 数据包可能会丢失或以错误的顺序传递(还有一些其他问题),因此您需要以某种方式处理它,这通常会导致您重新发明 TCP,但效果不佳。因此,除非您注意到 TCP/IP 不会削减它,否则请坚持使用它。

关于c - 在 C 中非常快速地发送多个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55170803/

相关文章:

c - 在函数内链接函数时出错

java - android自定义信任和 key 管理器

javascript - 我可以发回函数引用作为对 api 请求的响应吗?

networking - 设计应用协议(protocol)

Swift 泛型延期问题

c - 默认链接的库

c++ - 如何在 C 中将多字符常量转换为整数?

c - Makefile 条件语句不起作用

php - 共享中央套接字对象的PHP线程

url - WIX:如何将应用程序注册到 URL 协议(protocol)?