c++ - 在网络游戏中正确发送/接收数据的方法(UDP,但为什么不是 TCP)

标签 c++ sockets pthreads

我有一个带有 GUI 的 C++ 应用程序(在 PC 1 上)就像网络游戏一样运行,并以相当固定的时间间隔通过 WiFi(临时的,因此非常可靠)从另一台计算机 (2) 接收数据包 (像 40 毫秒),每个程序循环一次(2)。我使用发送/读取。

问题来了:
- 数据包并不总是完全发送(但显然您可以简单地保持 send() 剩余数据,直到所有数据都发送完毕,这样效果很好)
- 更重要的是,在(1)的循环中,数据包被堆叠在套接字中,直到发生read(),然后就无法区分大包中的数据包了数据流,或者知道您是否已经在数据包的中间。

我试图用 ID header 解决这个问题(你找到一个 ID 作为第一个字节,你知道数据包的长度),但我经常迷路(未知 ID:我们不在数据包的开头)并且我被迫忽略所有剩余的数据。

所以我的问题是:
为什么数据包会堆叠? (通常我有 400B 的数据,而我的数据包长度 <100B,fps (1) 和 (2) 差别不大)
我怎样才能有一个更可靠的方式来接收实际的数据包,比如 80% 的数据包(丢弃数据包丢失,这不是 UDP/TCP 的问题)?

用于接收数据包的单独线程是否可行? (关于(1),服务器)

实时网络游戏如何做到这一点(包括多客户端管理)?

提前致谢。

(对不起,我没有这里的代码,但我尽量说清楚了)

最佳答案

嗯:

1) UDP 传输消息,但不可靠。

2) TCP传输BYTE STREAMS,是可靠的。

UDP 无法可靠地传输消息。任何更可靠的东西都需要基于 UDP 的协议(protocol)。

TCP 无法传输只有一个字节长的消息。任何更复杂的东西都需要在 TCP 之上的协议(protocol)。

关于c++ - 在网络游戏中正确发送/接收数据的方法(UDP,但为什么不是 TCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093446/

相关文章:

c++:在多线程程序中写入文件

c++ - 异步 COM C++ 调用

c - Windows 自定义消息记录器的实现 : reports 10049 when ntwk cable unplugged

android - UDP图像流Android

c# - 如何在 C# 中断开 Socket, bool 变量 ReuseSocket。什么目的

c - POSIX 线程和公平性(信号量)

c - pthreads:如何断言代码在单线程上下文中运行

c++ - 使用 Win32 API 验证 HWND

c++ - 凯撒密码输入文本文件

c++ - 将双端队列传递给新的 pthread