UDP打孔:单机可测试性

dan*_*n78 5 c# p2p udpclient

我正在编写一个简单的P2P应用程序来测试在更大的项目中使用UDP穿孔的可行性.

我昨天在家尝试了我的测试应用程序并且他们工作了.

但是,我现在正在工作,相同的代码不再起作用.发送方在这里发送到我们路由器的外部IP地址上的相应端口,但接收方没有得到它们中的任何一个.

在呼叫之前UdpClient.Receive(),接收应用程序将一个数据包发送到它将监听的IP:端口.同样,这适用于我的家庭设置,但不是这里.无论Windows防火墙是打开还是关闭,结果都是相同的,所以这不是问题.

可能是路由器以不同的方式处理这种情况吗?

EDIT1:两个应用程序都在同一台机器上运行.

dan*_*n78 2

回答我自己的问题:

路由器确实表现出了不同的行为。

我的家庭路由器仅连接到我的笔记本电脑。我认为这就是为什么当我从端口 n发出 UDP 数据包时,它也会在端口 n上离开路由器。

然而,我的工作网络由多台计算机组成,路由器随机化其一端的端口,这意味着从端口 y发送的数据包将在端口 x上离开路由器。

我已经成功地让我的家庭和工作机器通过 NAT 进行通信,而无需使用端口转发,方法如下:

H - 将数据包从端口 a 发送到 W:b,从而为传入连接打开端口 a

W - 将数据包发送到 H:a 并切换到接收模式。它现在也有一个开放的端口。

H - 从 W 接收数据包,而不是假设知道要回复哪个端口,而是检查数据包的源端口并使用它。

H - 发送数据包到 W:源端口

W - 接收数据包。

瞧。

实际上,H 和 W 会联系服务器来交换连接详细信息,这简化了事情,因为服务器确切地知道 H 和 W 从哪个端口发送。