我正在编写一个简单的P2P应用程序,以测试在较大的项目中使用UDP打洞的可行性。

昨天我从家里试用了我的测试应用程序,它们起作用了。

但是,我现在正在工作,并且相同的代码不再起作用。发送方正在此处发送到我们路由器外部IP地址上的适当端口,但接收方没有收到它们。

在调用UdpClient.Receive()之前,接收方应用会将数据包发送到将要监听的IP:port。同样,这适用于我的家庭设置,但不适用于此处。无论Windows防火墙是打开还是关闭,结果都是一样的,所以这不是问题。

路由器对情况的处理方式可能不同吗?

EDIT1:两个应用程序都在同一台计算机上运行。

最佳答案

在回答我自己的问题时:

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

我的家用路由器仅连接到笔记本电脑。我认为这就是为什么当我从端口n 发送UDP数据包时,它也将路由器留在端口n 的原因。

但是,我的工作网络由几台计算机组成,并且路由器在其端部随机分配端口,这意味着从端口y 发送的数据包会将路由器留在端口x 上。

我已经成功地使我的家用和办公计算机通过NAT进行通信,而无需通过以下方式使用端口转发:

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

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

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

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

W-接收数据包。

瞧。

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

10-04 18:09