无端口/转发的c# P2P

本文关键字:P2P 转发 | 更新日期: 2023-09-27 18:08:08

我已经制作了一个服务器和客户端应用程序,它们相互连接,但是我必须在路由器中打开端口才能使其工作。

有我可以使用的不需要转发的端口吗?或者我可以应用的技巧?

我想保持p2p,避免在请求中间有服务器

无端口/转发的c# P2P

我知道有两种技术可以在这里应用。

技术1
UDP穿孔

UDP穿孔使用服务器作为"大厅"。
您想要与P2P连接的客户端首先使用UDP协议连接到服务器,因此客户端需要打开端口("洞")才能接收数据。

因为UDP是一个无连接协议,你可以设置客户端接受来自"大厅"服务器和彼此的数据包。

在两个客户端建立连接后,服务器将提供他们的伙伴的IP和匹配的"hole"-port。

在这里的答案中可以找到一个非常直接的实现。

技术2
通用或者

这是我最不喜欢的,因为它要求客户端的路由器具有uPnP支持并启用它。

c#中的

uPnP。. NET可以通过包含NATUPNPLib COM-library
轻松完成。(不要忘记在参考设置中禁用"嵌入互操作类型")

一个简单的实现是这样的:

    public const int upnp_port = 3075;
    private static UPnPNATClass pnp = new UPnPNATClass();
    private static IStaticPortMappingCollection mapc = pnp.StaticPortMappingCollection;
    public static IPAddress local_ip()
    {
        foreach (IPAddress addr in Dns.GetHostEntry(string.Empty).AddressList)
            if (addr.AddressFamily == AddressFamily.InterNetwork)
                return addr;
        return null;
    }
    public static void upnp_open()
    {
        mapc.Add(upnp_port, "UDP", upnp_port, local_ip().ToString(), true, "P2P Service Name");
    }
    public static void upnp_close()
    {
        mapc.Remove(upnp_port, "UDP");
    }

注意,这是快速编写的代码,它将需要忽略/优化,绝对是local_ip()函数,因为它可以在安装了几个网络适配器后变得不可靠。