我和老师接手一个即时通讯软件开发项目!遇到问题ing老师开始时候对UDP打洞原理了解还算充分,并且在实验室局域网内,各种网络拓扑情况都测试通过,可以先在拿到公网上面竟然出了问题!我形容一下我的情况,请高手给点指点,说明一下为什么出现这种情况!首先我们有一个公网的Server:111.111.111.1:2881
然后我正在使用的是2个NAT下的一个普通PCA:192.168.0.2:12345
我登陆服务器以后服务器看到我的公网信息是PCA:111.111.111.2:10000这时 为了方便测试我们用了另外一台公网的PCB测试,他的IP:Port是
PCB:111.111.111.3:12345并且登陆以后也是这样现在遇到一个问题!PCA要与PCB通信
PCA 发送数据给 PCB 成功!
PCB 从Server那里收到我的公网信息PCA:111.111.111.2:10000
PCB 发送数据给 PCA 失败!请问这个是为什么!!!
在没有测试的时候我预想是端口被改变了,但是我每隔30s向Server发送心跳信息!
Server看到我的信息端口没有改变阿!
如果真的是发生了一个socket出nat以后不同sesion不同端口的话,那么qq他们有时如何实现的呢,高手谢谢 帮忙看看之 , 小弟不胜感激!!!!!!!!!!!

解决方案 »

  1.   

    最简单的方法是在PCA的路由器开通一个端立映射,即把把10000端口映射到192.168.0.2 IP上!或者PCA从SERVER上获得PCB的地址后,直接与PCB通讯,相当于PCB作为一个服务器!
      

  2.   

    我晕 哈哈 上面的朋友 理解错了,我们做的事im软件,类似qq,你用qq的时候用作端口映射么?
    我刚找了点文章,上面提到我们可能是使用了Symmetric NAT:所以造成此现象,
    那位高人有这方面 现成的技术 !!帮忙 help 谢谢 提示一下 也可以
      

  3.   

    不管NAT是什么类型的,公网主动连内网都连不上!!
    一定要先是内网主动向公网发包了,公网才可以向公网发包的两个可以穿透的内网是彼此向对方发包,才能建立连接
      

  4.   

    现在遇到一个问题!PCA要与PCB通信
    PCA 发送数据给 PCB 成功!
    PCB 从Server那里收到我的公网信息PCA:111.111.111.2:10000
    PCB 发送数据给 PCA 失败!请问这个是为什么!!!
    ----------------------------
    这里,既然内网PCA向公网PCB发包成功了,那NAT肯定是分配了一个ip:port的
    如果这个ip:port与111.111.111.2:10000相同,那PCB向这个ip:port发是可以成功的
    如果不同,就不成功,证明这个NAT是不可穿透的
      

  5.   

    UDP打洞的难点在准确的判断NAT是什么类型(实质上只有两种,可穿透和不可穿透):
      

  6.   

    PCA 发送数据给 PCB 成功!
    PCB 发送数据给 PCA 成功!如果两者都在NAT后, 先发的一条会不被对方收到, 因为被NAT丢弃. 所以应该这样重复几次.这里说的先后, 是指NAT收到的先后, 而不是发送的先后, 考虑到网络延时的不对称性.
      

  7.   

    我也想知道你在Symmetric NAT下是怎么连接的?
      

  8.   

    我也想知道,我的即时通讯用TCP互连.
      

  9.   

    UDP:NAT后面的肯定收不到公网发出的,除非它自己先发出给公网的,记为半双工如果两个都是NAT后面的,需要公网上面的relay,这就是两个半双工TCP:
     我没搞过
      

  10.   

    skype是采用超级节点的方式实现的,主要也是找一个超级节点(也是一个用户),作为服务器来进行中转,除了使用中转的方式,穿NAT好像别的方法都行不通
      

  11.   

    PCB与PCA通讯过程:
    pcb向server发消息要求pca向pcb打洞
    server如此做了
    pca向pcb打洞了
    pcb尝试向pca发送消息
    如果有洞了,可以发送成功,没有洞,继续重复这个过程这个流程应该是可以的。。
      

  12.   

    恩 答案找到了 问题出在 对称NAT 连接不同 NAT分配的PORT也不同
    也就是一个socket穿过 NAT 向 pca和pcb发送信息,Nat分配的端口是不同的,甚至 发送pca的2个端口Nat都会分配不同的端口目前只有2个对称Nat需要服务器 中转,否则 打洞都顺利成功谢谢 上面的各位!  就此结贴!!!