我正在编写一个简单的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从哪个端口发送。