我有一个带有公共IP地址的服务器和一个NAT后面的客户端机器,用C#语言实现。 我试图编写一个tcp打孔,但是当从服务器到客户端进行套接字时出错。我的步骤如下:
1)1,我与公共服务器建立套接字连接并向其发送消息并开始侦听端口17000
2)2,Server获取了msg并解析它
3)3,我得到了remoteEndPoint IpAddress&服务器端的端口号(= Nat路由器Ip和端口)
4)第4次尝试连接到套接字(NAT Ip,Nat端口)并从服务器=>端口17000将msg发送到客户端意味着=我已经设置了nat路由器的套接字并希望路由器将我的消息发送到nat后面的客户端
但是我收到了以下错误: "连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应X.X.X.X:24352"
任何人都可以帮我解决问题。
提前致谢。
答案 0 :(得分:0)
你的问题可能就在这里:
Nat遍历(如打孔)取决于具体NAT的执行情况。 您假设由于NAT从客户端端口17000看到一个数据包,并将其映射到某个NAT端口X,然后它会将端口X中的所有数据包转发回客户端。 并非所有NAT都这样做!并希望路由器将我的消息发送到nat后面的客户端
定义了以下类型的NAT:
Cone NATs:NAT转换表条目存储内部地址和端口号与外部之间的映射的NAT 地址和端口号。 NAT转换表条目进入后 地址,入站流量到外部地址和端口号 允许和翻译任何源地址和端口号。
受限制的NAT:NAT转换表条目存储内部地址和端口号之间的映射的NAT 外部地址和端口号,用于特定源地址 或特定的源地址和端口号。一个入站数据包 匹配外部目标的NAT转换表条目 来自未知外部地址或端口的地址和端口号 数字被默默地丢弃。
对称NAT:将相同的内部地址和端口号映射到不同的外部地址和端口的NAT,具体取决于 外部目的地址(用于出站流量)。
您的打孔方法适用于Cone并解决受限制的NAT问题。不适用于对称NAT的端口限制NAT(在您的情况下可能是NAT)。