无端口/转发的C#P2P

无端口/转发的C#P2P,c#,network-programming,port,p2p,C#,Network Programming,Port,P2p,我制作了一个服务器和客户端应用程序,可以相互连接,但是我必须打开路由器中的端口才能工作 是否有我可以使用的不需要转发的端口? 还是我可以运用的技巧 我想保持P2P,避免在请求中有服务器。 我知道这里可以使用的两种技术。 技术1 UDP打孔 UDP打孔将服务器用作“大厅”。 要使用P2P连接的客户端首先使用UDP协议连接到服务器,因此客户端需要打开一个端口(“孔”)才能接收数据 因为UDP是一种无连接协议,所以您可以将客户端设置为接受从“大厅”服务器传入的数据包以及彼此之间的数据包 两个客户端建立

我制作了一个服务器和客户端应用程序,可以相互连接,但是我必须打开路由器中的端口才能工作

是否有我可以使用的不需要转发的端口? 还是我可以运用的技巧


我想保持P2P,避免在请求中有服务器。

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

技术1
UDP打孔

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

因为UDP是一种无连接协议,所以您可以将客户端设置为接受从“大厅”服务器传入的数据包以及彼此之间的数据包

两个客户端建立连接后,服务器将向它们提供其合作伙伴的IP和匹配的“洞”端口

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

技术2
通用即插即用

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

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

一个简单的实现如下所示:

public const int upnp_port=3075;
私有静态UPnPNATClass pnp=新的UPnPNATClass();
私有静态IStaticPortMappingCollection mapc=pnp.StaticPortMappingCollection;
公共静态ip地址本地_ip()
{
foreach(Dns.GetHostEntry(string.Empty).AddressList中的IPAddress地址)
if(addr.AddressFamily==AddressFamily.InterNetwork)
返回地址;
返回null;
}
公共静态无效upnp_open()
{
Add(upnp_端口,“UDP”,upnp_端口,本地_ip().ToString(),true,“P2P服务名称”);
}
公共静态无效upnp_close()
{
移除(upnp_端口,“UDP”);
}
请注意,这是快速编写的代码,需要忽略/优化,
local_ip()
的功能肯定会变得不可靠,因为安装了多个网络适配器