实现C#Tcp打孔时出错 - 无法连接NAT

时间:2014-08-01 15:31:03

标签: c# sockets networking nat

我有一个带有公共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"

任何人都可以帮我解决问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

你的问题可能就在这里:

  

并希望路由器将我的消息发送到nat后面的客户端

Nat遍历(如打孔)取决于具体NAT的执行情况。 您假设由于NAT从客户端端口17000看到一个数据包,并将其映射到某个NAT端口X,然后它会将端口X中的所有数据包转发回客户端。 并非所有NAT都这样做!

来自Microsoft Technet:

  

定义了以下类型的NAT:

     
      
  • Cone NATs:NAT转换表条目存储内部地址和端口号与外部之间的映射的NAT   地址和端口号。 NAT转换表条目进入后   地址,入站流量到外部地址和端口号   允许和翻译任何源地址和端口号。

  •   
  • 受限制的NAT:NAT转换表条目存储内部地址和端口号之间的映射的NAT   外部地址和端口号,用于特定源地址   或特定的源地址和端口号。一个入站数据包   匹配外部目标的NAT转换表条目   来自未知外部地址或端口的地址和端口号   数字被默默地丢弃。

  •   
  • 对称NAT:将相同的内部地址和端口号映射到不同的外部地址和端口的NAT,具体取决于   外部目的地址(用于出站流量)。

  •   

您的打孔方法适用于Cone并解决受限制的NAT问题。不适用于对称NAT的端口限制NAT(在您的情况下可能是NAT)。