我有一个带有 GUI 的 C++ 应用程序,它像网络游戏一样运行(在 PC 1 上),并以相当固定的时间间隔(如 40 毫秒)通过 WiFi(ad-hoc,因此非常可靠)从另一台计算机(2)接收数据包, 程序 (2) 上的每个循环一次。我使用发送/读取。
这是问题所在:
- 数据包并不总是完全发送(但显然你可以简单地保留send()
剩余的数据,直到所有数据都发送完毕,这很好)
-更重要的是,数据包在(1)的循环期间堆叠在套接字中直到read()
发生,然后就无法区分大数据流中的数据包,或者知道您是否已经在数据包的中间。
我试图用 ID 头来解决这个问题(你发现一个 ID 作为第一个字节并且你知道数据包的长度),但我经常迷路(未知 ID:我们不在数据包的开头)并且被迫忽略所有剩余的数据。
所以我的问题是:
为什么数据包会堆叠?(通常我有 400B 的数据,而我的数据包长度 <100B 并且 fps (1) 和 (2) 差别不大)
我怎样才能有更可靠的方式来接收实际数据包,比如 80% 的数据包(丢弃数据包丢失,不是UDP/TCP的问题)?
用于接收数据包的单独线程会起作用吗?(在 (1) 上,服务器)
实时网络游戏如何做到这一点(包括多客户端管理)?
提前致谢。
(对不起,我这里没有代码,但我尽量说清楚)