gpt4 book ai didi

没有端口/转发的 C# P2P

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:02 24 4
gpt4 key购买 nike

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

是否有不需要转发的端口可供我使用?或者我可以应用的技术?

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

最佳答案

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

技巧一
UDP 打洞

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

因为 UDP 是一种无连接协议(protocol),您可以将客户端设置为接受来自“大厅”服务器和彼此的数据包。

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

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

技巧二
通用即插即用

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

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

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

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

关于没有端口/转发的 C# P2P,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com