没有会合服务器的 C# UDP punchthrough

C# UDP punchthrough without rendevous server

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

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

提前致谢。

P.S。我使用的是 .NET Unity 使用的版本,大约是 2.0。

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

P.P.P.S。或者除了 Http 之外几乎任何协议!

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

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