C# UDP打孔:单机可测试性

C# UDP打孔:单机可测试性,c#,p2p,udpclient,C#,P2p,Udpclient,我正在编写一个简单的P2P应用程序,以测试在更大的项目中使用UDP打孔的可行性 昨天我在家里试用了我的测试应用程序,它们成功了 然而,我现在正在工作,同样的代码不再起作用。发送方正在发送到路由器外部IP地址上的相应端口,但接收方没有收到任何消息 在调用UdpClient.Receive()之前,接收应用程序会向它将要侦听的IP:端口发送一个数据包。同样,这适用于我的家庭设置,但不是在这里。无论Windows防火墙是打开还是关闭,结果都是一样的,所以这不是问题所在 这可能是因为路由器的处理方式不同

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

昨天我在家里试用了我的测试应用程序,它们成功了

然而,我现在正在工作,同样的代码不再起作用。发送方正在发送到路由器外部IP地址上的相应端口,但接收方没有收到任何消息

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

这可能是因为路由器的处理方式不同吗


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

回答我自己的问题:

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

我的家庭路由器连接到我的笔记本电脑上。我假设这就是为什么当我从端口n发送UDP数据包时,它也会将路由器留在端口n

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

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

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

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

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

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

W-接收数据包


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

您的路由器是否运行任何类型的NAT?是否需要端口转发设置?发送方和接收方之间是否存在任何类型的防火墙(在路由器或其他设备上)?这两种路由器都是典型的SOHO NAT路由器。两者都关闭了防火墙功能。这样做的目的是避免端口转发。:)我会使用wireshark在网络级别上查看所有内容。@Lazarus:UDP打孔是一种通过NAT的技术:)