无端口/转发的c# P2P
本文关键字:P2P 转发 | 更新日期: 2023-09-27 18:08:08
我已经制作了一个服务器和客户端应用程序,它们相互连接,但是我必须在路由器中打开端口才能使其工作。
有我可以使用的不需要转发的端口吗?或者我可以应用的技巧?
我想保持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()
函数,因为它可以在安装了几个网络适配器后变得不可靠。