Server  和 Client A 同一台机器!
Client B 一台机器,在同一局域网, 都没有安装防火墙之类的软件,用网上的例子,是可以打通的!。现在的思路是 
1) Client A 用 UDP connect to Server, Server 发送 client A 接收 自己的 IP  和 Port;
2) Client 用 TCP (之前TCP连接已经建立) 发自己的 IP 和 Port , 和目标 Client B 发给server;
3) server TCP 发送 Client A 的IP 和PORT 给 Client B ;
4) Client B 启用 UDP connect to server; (有数据包通信的) 
5)Client B 用 UDP 给 client A 发送数据包.( 此地址是 Server 传过来的IP 和PORT) // 这里。,用 iris 监视
可以看到数据包,并且IP 和 port 都是正确!但 client A 无法收到 client B 的数据包请问现在我的问题出在哪里?
  是打洞的步骤出了问题!
还是程序的其他问题? 

解决方案 »

  1.   

    不明白你这个是什么打洞...  感觉你的server就是把A的IP,PORT 告诉B, 其他什么作用也没有... B 和 A在一个局域网, 而且B是直接连的A的地址, 那么A怎么会收不到B的包? 除非是A没有在那个port上listen起~
      

  2.   

    现在在局域网测试而已,server 的TCP 存有大量的用户信息呀。
    如果这样的不行话,只能再想它法了!
      

  3.   

    而实际上, 
    UDP 打洞所经的历程,已经全部实现,TCP server 只作一个辅助作用而已,
    所以......
    而iris 可以监视到发送过来的数据包,是不是代表已经打洞成功呢?
      

  4.   


    即使是测试,server的功能也不会少吧...
    可你描述的server就只干了一件事,把A的IP,PORT 告诉B
      

  5.   

    有点混乱, 一会儿UDP, 一会儿TCP, 还有放在局域网测试有意义吗, 还有NAT支持吗?
      

  6.   

    局域网 都不通过WWW也不行吧! 一步一步走呀!既然大家都认为TCP 惹了问题,我搞个全UDP 通信的试试,
    本来就想偷这个懒,
    凭预感,与TCP无关的! 那我把这个IP  和 Port 用 UDP 传吧。
      

  7.   

    UDP就是用STUN的方法,在RFC 3489已经描述的很清楚了,自己看去吧
      

  8.   

    http://blog.csdn.net/overmaker/archive/2008/11/01/3201799.aspx这个是我见过的最详细的中文资料
      

  9.   

    看了下。。你是把洞打通了,但是你没有继续下去啊。。少了一步:
    Client B 用 UDP 给 client A 发送数据包    这个步骤,只是在B的NAT上打了个洞,到达A的NAT后,查询不到你的ip/port记录,会被丢弃的。。到此已经基本成功了。。加上一步:
    Client A隔段时间后,想Client B的NAT上发数据。。 由于洞已经打通了,数据道道B的NAT后,会有A的IP/PORT记录,然后UDP包就会被转发到Client A。。
    原则就是:A连接B,就是B先发数据给A,在自己那边打个洞,然后A在发数据给B,通过那个洞就进去了。。
      

  10.   

    再加上一个限制:
    NAT设备必须满足如下一个条件:对外的连接,如果源MAC,PORT一样,在NAT上就不会开启新的端口,直接利用原有端口。。只有很少的NAT不是这样。对内的数据包转发规则:只有源ip,源端口在NAT上有记录了,才向内部机器转发。(记录的过程,就是你的最后一步,就是自己给自己打洞,然后别人用那个洞钻进去。)PS:就是因为打洞的时候,我还是用得那个原有端口,所以在NAT上不会产生一个新的port,所以后面进洞的时候,直接使用服务器发过来的洞口就可以直接进去了。。这点非常关键。
      

  11.   

    和svr的通信是否和TCP有关我没有确认,我想应该无关的,但是我觉得应该保证自己bind一个端口来和svr进行通信,因为NAT应该是通过源MAC+源port来创建session的(这种是CONE NAT,最常见的)。整个打洞的过程,楼上应该说的很清楚。A和svr通信是为了NAT上面有自己的session,B也是。两个session都建立的同同时,尝试从svr上面获取对方的ip:port,获取到以后就互相发送消息(这个时候可以穿过NAT了)。这个东西我刚研究,也许有错。欢迎指正。
      

  12.   

    server 和 A 同一台机 ,B另一机 ,并且 Server、 A、 B在同一局域网,这里面 有打洞吗?同一局域网都收不到数据??
      

  13.   

    我把 PROT 和 ADDRESS 通过UDP来传送,成功,中间也可能是其他代码,改动过!
    现在也不打算确定原因在哪里。或许也没有这个必要吧! 
    一样的模式能打通即可!
      

  14.   

    A发送两个消息,一个告诉SERVER要B向自已打洞,一个向B的地址打洞(仅仅是建立一个出去的通道映射).server告诉B A的地址后,B向这个地址打洞,路由器不会拦掉出去的消息,这时A中和B中都有了一个通道映射,这样才可以通信了.