我正在研究我的游戏引擎的多人游戏模块。我没有任何代码要发布,因为服务器和客户端都在发送和接收我想要的内容,所以这是一个更加理论化的问题。我一直试图在互联网上找到答案,但似乎没有任何东西能指出我正确的方向。
基本上,我有一个能够连接的基本服务器,以便查看统计信息,连接到其他GAME服务器,等等。整个客户端 - 服务器模型是TCP。但是,问题来自我的游戏服务器。在这种情况下,所有播放器和服务器之间的TCP连接建立在某个端口上,我通过UDP在另一个端口上向服务器发送数据包和从服务器发送数据包。这样做的原因是,我可以从不太重要的“状态”更新中分离重要消息。在本地,这工作正常,但是当我“通过互联网”尝试这个,数据包被发送但没有收到。
TCP连接确实通过互联网建立,但UDP数据包不会到达其位置。我尝试在Windows防火墙(出站和入站)中添加规则,并且我已在所有系统上完成端口转发。我知道事实并非我的代码有问题。
两个系统都在64位Windows 7上运行。我每秒发送64个字节数据包40次而没有一个正在通过,所以它不是“丢包”问题。
最后,我的问题是:还有什么其他可以阻止UDP数据包的东西?我需要考虑哪些事情?我已经忘记了bind()阶段等等。
我知道这是一个非常理论化的问题和广泛的问题,但我不知道还能做什么,因为问题不再存在于代码中。我一定很遗憾。非常感谢任何建议或建议。再次,对不起这个问题有多广泛,但这是我的最后一招。
谢谢!
答案 0 :(得分:3)
我在这种情况下做的第一件事是我启动WireShark并观察我的数据包输出 - 只是为了确保一切正常。如果你能够在远程端运行数据包抓取器,这可能会告诉你更多 - 比如接收操作系统是否由于某种原因阻止了你。如果您看到数据包离开源但未到达目的地,则它们将在途中被丢弃。这可能发生在任何数量的防火墙或路由器上。
我的家庭路由器配置为阻止所有入站UDP流量。这是比你想象的更常见的情况。大多数家庭网络设备(可能还有Windows防火墙)都会阻止入站UDP流量,除非他们已经看到具有相同(sourceip,destip,sourceport,destport)签名的出站流量。
此通信的每一端的网络配置是什么样的?你使用什么UDP端口?
答案 1 :(得分:2)
无法保证传送UDP数据包。他们迷路的原因有一百种,从拥堵到政策封锁到......
UDP是一种轻量级协议,适用于数据发生变化或状态不重要的应用程序。例如,VOIP通常会使用UDP,因为数据流是动态的,并且半秒前丢弃的内容并不重要。
简而言之,如果您需要保证交付,必须使用TCP - 这就是它的用途。
答案 2 :(得分:1)
我要尝试的第一件事就是通过互联网连接在两台机器之间以UDP模式(nc -u
)使用 netcat 并使其正常工作。通过这种方式,您可以确保软件没有问题。
根据您的描述,我认为这是一个防火墙问题。确保UDP数据包首先通过防火墙。防火墙中可能有多个设置阻止UDP数据包。仅Linux的有状态数据包跟踪将阻止所有传入的UDP数据包,即使规则中没有明确提及它。