18

我正在尝试使用 mingw 工具链使用 Windows 套接字实现 TCP 打孔。我认为这个过程是正确的,但漏洞似乎并没有发生。我以此为参考。

  1. AB连接到服务器S
  2. S发送给A , B的路由器 IP + 它用来连接S的端口
  3. S对B做同样的事情
  4. 开始2个线程:
    • 一个线程尝试使用S发送的信息连接到B的路由器
    • 另一个线程在连接到S时正在等待连接到其路由器的同一端口上的传入连接
  5. B做同样的事情

我认为代码没有问题,因为:

  • AB确实让对方使用 ip 和 port
  • 当他们联系服务器时,他们都在监听他们用来连接路由器的端口
  • 它们都连接到正确的 ip 和端口,但超时(代码错误10060

我错过了什么?

编辑:在流程资源管理器的帮助下,我看到其中一个客户端设法建立了与对等方的连接。但是对等体似乎没有考虑建立连接。

这是我用 Wireshark 捕获的。举例来说,服务器S和客户端A在同一台 PC 上。服务器S8060侦听重定向到该 PC的特定端口 ( )。B仍然尝试在正确的 IP 上连接,因为它看到S发送的A的公共地址是,因此使用S的公共 IP 。(我已经用占位符替换了公共 IP)localhost

线鲨

编辑2:我认为混淆是由于传入和传出连接请求数据都在同一个端口上传输。这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据。如果我引用 msdn:

SO_REUSEADDRsocket 选项允许一个套接字强制绑定到另一个套接字正在使用的端口。第二个套接字调用 setsockopt,其中 optname 参数设置为SO_REUSEADDR, optval 参数设置为布尔值,TRUE然后在与原始套接字相同的端口上调用 bind。一旦第二个套接字成功绑定,绑定到该端口的所有套接字的行为都是不确定的。

但是 TCP 打孔技术需要在同一个端口上通话才能打开孔

4

4 回答 4

15

A 启动 2 个线程:
一个线程尝试使用 S 发送的信息连接到 B 的路由器
另一个线程在连接到 S 时正在等待用于连接其路由器的同一端口上的传入连接

你不能用两个线程来做这件事,因为它只是一个操作。每个建立出站连接的 TCP 连接也在等待传入连接。您只需调用“连接”,并且您都在发送出站 SYN 以建立连接并等待入站 SYN 建立连接。

但是,您可能需要关闭与服务器的连接。当您已经从同一个端口建立连接时,您的平台可能不允许您从该端口建立 TCP 连接。因此,正如您开始 TCP 打孔一样,关闭与服务器的连接。将新的 TCP 套接字绑定到同一端口,然后调用connect.

于 2012-01-19T05:32:55.557 回答
2

遍历 NAT 路由器的一个简单解决方案是让您的流量遵循您的 NAT 已经具有转发算法的协议,例如 FTP。

于 2012-01-19T05:04:50.153 回答
0
  1. 使用 Wireshark 检查 tcp 连接请求(3-way Handhsake 过程)是否正常。

  2. 确保您的侦听器线程具有 select() 来解复用描述符。

  3. sockPeerConect(socket used to connect Other peer) is FD_SET() in Listener Thread。

  4. 确保您正在检查

     int Listener Thread()
     {
       while(true)
       {
           FD_SET(sockPeerConn);
           FD_SET(sockServerConn);
           FD_SET(nConnectedSock );
          if (FD_ISSET(sockPeerConect)
          {
            /// and calling accept() in side the
            nConnectedSock = accept( ....);
    
           }
           if (FD_ISSET(sockServerConn)
           {
            /// receive data from Server
            recv(sockServerConn );
    
           }
           if (FD_ISSET(nConnectedSock )
           {
            /// Receive data from Other Peer
             recv(nConnectedSock );
    
           }
    
       }
      }
    

5.确保您同时启动对等连接 A 到 B 和 B 到 A。
6.在连接到服务器和对等之前启动您的侦听器线程,并具有用于接收服务器和客户端的单个侦听器线程。

于 2012-01-11T17:03:30.043 回答
-3

并非每个路由器都支持 tcp 打孔,请查看以下详细说明的论文:

跨网络地址转换器的对等通信

于 2012-01-17T03:09:19.090 回答