4

我正在尝试使用 Peer to Peer 将 Internet 上的网络添加到我的游戏中。我已经实现了一个仅限 LAN 的版本,它使用 .NET 的点对点类在本地网络中进行连接。

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

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

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

现在我有一堆问题

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

谢谢!

4

2 回答 2

3

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

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

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

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

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

于 2011-07-22T18:34:19.553 回答
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(布尔值)。将 NAT Traverse 的值设置为 true。它使用 IPv6 地址进行连接。您可以通过在命令提示符下编写一些命令从“Teredo”服务器获取 Ipv6 全局地址。实际上,IPV6 是用来避免这个问题的技术。

于 2014-04-30T10:12:33.837 回答