没有集合服务器的 C# UDP 穿透

Posted

技术标签:

【中文标题】没有集合服务器的 C# UDP 穿透【英文标题】:C# UDP punchthrough without rendevous server 【发布时间】:2016-09-15 15:54:39 【问题描述】:

我正在编写一个程序,它需要两个客户端(点对点)在不使用任何服务器的情况下相互连接,即使只是在配对过程中也是如此。两个客户端都已经知道彼此的公共和私有 IP。一个或两个客户端可能位于 NAT 之后。我不能依赖 IPv6。

我遇到的问题是一个客户端(我们称他们为 A)必须将数据包发送到另一个(B),该数据包在 A 的 NAT 上打了一个洞,并通过 B 的 NAT,而 B 的 NAT 已经打好了。但是,这要求 A 知道 B 已穿通到的 B 的 NAT 上的外部端口,因为不能使用 B 在 NAT 后面的本地端口。此外,B 无法从其 NAT 后面识别此端口。 有什么办法可以辨别这个端口,或者直接让B告诉NAT使用哪个端口?

提前致谢。

附:我正在使用 Unity 使用的 .NET 版本,大约 2.0。

P.P.S.如果您有适用于 TCP 的解决方案,我也会接受!

P.P.P.S.或者几乎是 Http 以外的任何协议!

【问题讨论】:

我知道 4y 已经过去了,但是,这个话题仍然是相关的。尝试发送到 B 的 NAT 的每个端口怎么样。只有 65356 种可能性。这样您就可以完全避免使用公共服务器。我还在学习这项技术,我还没有亲自尝试过,所以如果这个想法可行,我不会。 【参考方案1】:

您必须有一个众所周知的公共服务器才能在 2 个端点之间进行协商。

这是这个概念在 c# 中的一个很好的实现: https://github.com/7wingfly/P2Pchat

【讨论】:

以上是关于没有集合服务器的 C# UDP 穿透的主要内容,如果未能解决你的问题,请参考以下文章

内网穿透(集合)

内网穿透(集合)

内网穿透(集合)

frp内网穿透服务端frps.ini各配置参数详解

Frp---树莓派4B内网穿透

FRP 内网穿透服务免费使用的详细教程