我正在尝试使用点对点将互联网网络添加到我的游戏中。
我已经实现了仅 LAN 版本,它使用 .NET 的对等类在本地网络内进行连接。
我意识到我需要使用 UDP 打洞来建立与防火墙后面的其他客户端的连接。
这就是我开始实施它的方式:
该服务器是一个 HTTP 服务器,使用非常简单的 PHP 脚本来完成工作。
- 在服务器上注册名称,将私有 IP 地址和端口作为 GET 变量发送
- 当服务器收到注册请求时,会保存公共端点和私有端点
- 请求连接到另一个客户端。
- 服务器将返回客户端的私有和公共端点
- 每两秒,第二个客户端将与服务器进行检查,如果有另一个客户端尝试与其连接,它也会获取其端点
- 两个客户端开始向彼此的公共端点发送垃圾邮件,直到获得有效响应
现在我有很多问题
- 服务器可以是 HTTP 服务器吗?
- 当我向 HTTP 服务器发出请求时,每次发出请求时客户端端口都会发生变化。专用端点是否始终与同一个公共端点匹配?
- 对服务器的请求是否必须与对客户端的 UDP 消息具有相同的源端点?
- 有没有办法使用指定的源端点连接到 C# 中的 HTTP 服务器?
- 我的实现有什么问题吗?
Thanks!
UDP 打洞是一个复杂的主题,人们已经进行了许多尝试来寻找有效的解决方案。问题在于,有很多不同的 NAT 路由器,并且没有实现 NAT 的标准方法,因此所有路由器的行为都有些不同。
一些尝试已经标准化,例如STUN https://www.rfc-editor.org/rfc/rfc3489, ICE https://www.rfc-editor.org/rfc/rfc5245。它们仍然只在大多数情况下起作用,而不是全部,但它们积累了大量的知识并解决了许多问题——比您的尝试所能做到的还要多,仅仅是因为您无法用世界上的每个 NAT 路由器来测试您的解决方案。例如,Skype花费了数年时间来完善其NAT穿越机制。
我推荐你看一下STUN或者最好是ICE。尝试实现其中之一或寻找现有的实现。
另一种选择可能是简单地在路由器上创建一个端口转发,例如使用UPnP or NAT-PMP.
也就是说,如果 .NET 对等类带有 NAT 遍历机制,我不会感到惊讶,但我对它们并不熟悉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)