没有端口/转发的C#P2P

时间:2015-08-15 12:47:04

标签: c# network-programming port p2p

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

我可以使用哪些端口不需要转发? 或者我可以应用的技术?

我想保留p2p并避免在请求中间有服务器。

1 个答案:

答案 0 :(得分:0)

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

技术1
UDP打孔

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

由于UDP是一种无连接协议,因此您可以将客户端设置为接受来自“lobby”-server和彼此传入的数据包。

两个客户建立连接后,服务器将为他们提供合作伙伴的IP并匹配“hole”-port。

可以在答案here中找到非常简单的实现。

技术2
通用即插即用

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

通过包含NATUPNPLib COM库,可以轻松完成C#.NET中的uPnP (不要忘记在参考设置中禁用“嵌入互操作类型”)

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

    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()函数,因为它可能会因安装了多个网络适配器而变得不可靠。