UDP穿孔帮助

本文关键字:帮助 穿孔 UDP | 更新日期: 2023-09-27 18:03:17

我正在尝试通过互联网将网络添加到我的游戏中,使用点对点。我已经实现了一个局域网版本,它使用。net的点对点类来连接本地网络。

我意识到我需要使用UDP打孔,以便与防火墙后面的其他客户端建立连接。

这是我如何开始实现它:该服务器是一个HTTP服务器,使用非常简单的PHP脚本来完成工作。

    • 在服务器上注册名称,发送私有ip地址和端口作为GET变量
    • 当服务器收到注册请求时,它将保存公共端点和私有端点
    • 请求连接另一个客户端。
    • 服务器将返回客户端的私有和公共端点
    • 每两秒钟,第二个客户端将与服务器签入,如果有另一个客户端试图与它连接,它也将获得它的端点
    • 两个客户端开始向彼此的公共端点发送垃圾邮件,直到它们得到一个有效的响应

现在我有一堆问题

  1. 服务器可以是HTTP服务器吗?
  2. 当我向HTTP服务器发出请求时,每次发出请求时客户端端口都会更改。私有端点是否总是与相同的公共端点匹配?
  3. 对服务器的请求必须具有与向客户端的UDP消息相同的源端点吗?
  4. 是否有一种方法可以使用指定的源端点连接到c#中的HTTP服务器?
  5. 我的执行有什么问题吗?

谢谢!

UDP穿孔帮助

UDP穿孔是一个复杂的主题,已经进行了许多尝试来找到一个有效的解决方案。问题是有这么多不同的NAT路由器,并且没有实现NAT的标准方法,所以所有路由器的行为都有点不同。

一些尝试已经标准化,例如STUNICE。它们仍然只在大多数情况下有效,而不是全部,但它们积累了大量的知识并解决了许多问题——比您的尝试所能做到的要多,因为您无法在太阳下的每个NAT路由器上测试您的解决方案。例如,Skype花了数年时间完善其NAT穿越机制。

我建议你看一下STUN或者最好是ICE。尝试实现其中一个或查找现有的实现。

另一个选择可能是简单地在路由器上创建一个端口转发,例如使用UPnPNAT-PMP

也就是说,如果。net对等类带有NAT遍历机制,我不会感到惊讶,但我对它们并不熟悉。

STUN是这个问题的最佳解决方案。它适用于大多数情况。下面是一个简单的示例(c#),它给出了NAT类型,本地IP:端口和公共IP:端口。

       try
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Any, 0));
            STUN_Result result = STUN_Client.Query("stunserver.org", 3478, socket);
            Console.WriteLine("Net Type : " + result.NetType.ToString());
            Console.WriteLine("Local IP : " + socket.LocalEndPoint.ToString());
            if (result.NetType != STUN_NetType.UdpBlocked)
            {
                Console.WriteLine("Public IP : " + result.PublicEndPoint.ToString());
            }
            else
            {
                Console.WriteLine("");
            }
        }
        catch (Exception x)
        {
            Console.WriteLine(x.StackTrace.ToString());
        }

你可以添加一些断点并检查代码的行为。

也可以使用vs2010 onwords (.net4.0 <)遍历NAT. 有一个AllowNATTraversal (bool值)方法。为NAT Traverse设置值为true。它使用Ipv6地址进行连接。您可以通过在命令提示符中编写一些命令从"Teredo"服务器获取Ipv6全局地址。实际上,IPV6是用来避免这个问题的技术。