UDP打孔帮助

时间:2011-07-22 18:15:16

标签: c# .net udp p2p hole-punching

我正在尝试通过互联网将网络添加到我的游戏中,使用Peer to Peer。 我已经实现了一个仅限LAN的版本,它使用.NET的对等类来连接本地网络。

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

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

    • 在服务器上注册名称,将私有IP地址和端口作为GET变量发送
    • 当服务器获得注册请求时,它将保存公共端点和私有端点
    • 请求连接到另一个客户端。
    • 服务器将返回客户端的私有和公共端点
    • 每两秒钟,第二个客户端将检入服务器,如果有另一个客户端尝试连接它,它也将获得其端点
    • 两个客户都开始向其他公共端点发送垃圾邮件,直到他们收到有效回复
  1. 现在我有一堆问题

    1. 服务器可以是HTTP服务器吗?
    2. 当我向HTTP服务器发出请求时,每次发出请求时客户端端口都会更改。私有端点是否始终与同一公共端点匹配?
    3. 对服务器的请求是否必须与发送给客户端的UDP消息具有相同的源端点?
    4. 有没有办法使用指定的源端点连接到C#中的HTTP服务器?
    5. 我的实施有问题吗?
    6. 谢谢!

2 个答案:

答案 0 :(得分:3)

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

一些尝试已经标准化,例如STUNICE。它们仍然只在大多数情况下工作,而不是全部,但是它们积累了大量的知识并解决了许多问题 - 比你的尝试更多,仅仅是因为你无法在阳光下使用每个NAT路由器测试你的解决方案。例如,Skype花了数年时间来完善其NAT遍历机制。

我建议您查看 STUN 或最好是 ICE 。尝试实现其中之一或寻找现有的实现。

另一种选择可能是简单地在路由器上创建一个前向端口,例如使用 UPnP NAT-PMP

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

答案 1 :(得分:0)

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地址进行连接。您可以从#34; Teredo"获得Ipv6全球地址。服务器通过在命令提示符下编写一些命令实际上,IPV6是用于避免此问题的技术。