普通的P2P(两个Clinet端 A 和B 在不同的NAT后面,中间服务器 S 在另外一个网络)我已经可以顺利连接了, 中途必须经过服务器的“牵线”。服务器知道两个Client端的外部和内部IP和端口。现在的问题是:如果我有一个客户端A,它跟服务器S在同一个局域网内,而另外一个客户端B在两一个NAT后面,用刚才的方法就没办法了解决了。不知道有没有高手解决过这样的问题??急!!!

解决方案 »

  1.   

    网络通信版这个帖子应该有讨论过,记不得了
    http://search.csdn.net/Expert/topic/1090/1090361.xml?temp=.599682
      

  2.   

    在这种情况下,其中在服务器后面的那个客户端(客户端A)的外网地址,服务器S是无法知道的。(当然,通过查找底层的NAT端口映射表应该是能够获得的。)所以,现在知道的仅仅是另外一个客户端(客户端B的外网地址。)
    如果客户端B是Cone NAT,并且不是Port-Restricted Cone NAT,那么可以考虑,A->B。
    过程:
        1 A通过S通知B向S方向打洞(因为A的外网地址肯定是S的地址,但是A的外网端口不知道,所以B不能是Port-Restricted Cone NAT)
        2 A向B的外网地址发送信息
        3 B接收到A的信息的同时,知道了A的外网地址。以后的通信接可以直接使用这个地址了。
      

  3.   

    B收不到A的信息。
    即使B曾经向S发送过消息。
      

  4.   

    在普通的P2P情况下,B向A发一次,A收不到,A向B发,B也收不到,B再向A发,A才收到。
    此前,他们都用那个端口向S发过UDP。现在是S不知道A的外部端口,而B根本收不到A的信息。
      

  5.   

    To 楼主:
        你的客户端B的NAT类型是什么?我的回复中已经指出了,如果B是Port-Restricted Cone NAT,那么B将无法收到A的信息(因为B打洞时无法知道A的外网地址的短口号。)
      

  6.   

    如果B曾经向S发送过信息,B收不到A的信息,为什么?(我是菜鸟哈)
    S是一个服务器却处于一个NAT中,A可以找到S,但B怎么找到S?S使用静态端口映射?
    如果都能找到,还不简单?
      

  7.   

    TO shootingstars(有容乃大,无欲则刚) 我说过,B无法收到A的UDP,即使之前,它曾经向S发送过UDP,而且S也回过一个UDP,不过要是A也向B的那个外部IP和Port发,B是收不到的。估计B是在一个Port-Restricted Cone NAT后面,似乎这种情况还很多。就象我刚才说的:
    在普通的P2P情况下,B向A发一次,A收不到,A向B发,B也收不到,B再向A发,A才收到。
    此前,他们都用那个端口向S发过UDP。
      

  8.   

    你的这种情况其实我想在商业软件上应该是不会遇到的,即:作为服务器的计算机同时作为一些客户端的NAT。你说的这些现象表明B很可能是一个Port-Restricted Cone NAT,其实你完全可以使用STUN协议来获得NAT的类型,关于STUN的客户端你可以去http://sourceforge.net/projects/stun/上下载。如果确定了B是位于Port-Restricted Cone NAT后面。我想只有两种方法可以解决这个问题:
    1 在服务器上查询NAT的Session表,获取A的外网地址(具体如何做,我不知道)2 借助另外的一个共网IP计算机来获取A的公网地址。另外:我的一篇拙文希望对你有用:
    http://community.csdn.net/Expert/topic/3091/3091185.xml?temp=.8497431
      

  9.   

    我以前看过你的文章,我的P2P也是按照那个思路做的。对很多人都有帮助。至于我现在的这个问题,估计要借助另外一个网关来获得A的外部IP和PORT,主要是PORT。至于B是什么NAT类型,我没办法管。我碰到的可能就是Port-Restricted Cone NAT , 客户才不管那么多,能通就是好东西。
      

  10.   

    妥协一点的办法
    1,在网关设置端口映射
    2,申请内网IP的域名服务http://www.meibu.com