我和老师接手一个即时通讯软件开发项目!遇到问题ing

q44072429 2007-05-08 08:00:57
我和老师接手一个即时通讯软件开发项目!遇到问题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他们有时如何实现的呢,高手谢谢 帮忙看看之 , 小弟不胜感激!!!!!!!!!!!
...全文
1575 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaaong 2007-05-11
  • 打赏
  • 举报
回复
PCB与PCA通讯过程:
pcb向server发消息要求pca向pcb打洞
server如此做了
pca向pcb打洞了
pcb尝试向pca发送消息
如果有洞了,可以发送成功,没有洞,继续重复这个过程

这个流程应该是可以的。。
jiaaong 2007-05-11
  • 打赏
  • 举报
回复
关于穿透本来就不是100%成功的。。有一部分比较特殊的路由器是不能成功的。不过纪律比较小。你应该多测试一些机器
q44072429 2007-05-11
  • 打赏
  • 举报
回复
恩 答案找到了 问题出在 对称NAT 连接不同 NAT分配的PORT也不同
也就是一个socket穿过 NAT 向 pca和pcb发送信息,Nat分配的端口是不同的,甚至 发送pca的2个端口Nat都会分配不同的端口

目前只有2个对称Nat需要服务器 中转,否则 打洞都顺利成功

谢谢 上面的各位! 就此结贴!!!
lauxp 2007-05-10
  • 打赏
  • 举报
回复
UDP:

NAT后面的肯定收不到公网发出的,除非它自己先发出给公网的,记为半双工

如果两个都是NAT后面的,需要公网上面的relay,这就是两个半双工

TCP:
我没搞过
csuxiong 2007-05-10
  • 打赏
  • 举报
回复
skype是采用超级节点的方式实现的,主要也是找一个超级节点(也是一个用户),作为服务器来进行中转,除了使用中转的方式,穿NAT好像别的方法都行不通
疯狂明仔 2007-05-09
  • 打赏
  • 举报
回复
应该不是打洞方面的问题,,
cenchure 2007-05-09
  • 打赏
  • 举报
回复
老师都不行??? 不行还接?
ideawu 2007-05-09
  • 打赏
  • 举报
回复
PCA 发送数据给 PCB 成功!
PCB 发送数据给 PCA 成功!

如果两者都在NAT后, 先发的一条会不被对方收到, 因为被NAT丢弃. 所以应该这样重复几次.

这里说的先后, 是指NAT收到的先后, 而不是发送的先后, 考虑到网络延时的不对称性.
任亚军 2007-05-09
  • 打赏
  • 举报
回复
厉害,强人
lovebanyi 2007-05-09
  • 打赏
  • 举报
回复
并不是所有的情况都可以打洞成功..打洞不成功的消息需要服务器中转
cheniwantyou 2007-05-09
  • 打赏
  • 举报
回复
现在的老师都很菜~~~
  • 打赏
  • 举报
回复
我也想知道,我的即时通讯用TCP互连.
xujianlane 2007-05-09
  • 打赏
  • 举报
回复
我也想知道你在Symmetric NAT下是怎么连接的?
fox1999 2007-05-09
  • 打赏
  • 举报
回复
上面的问题已经找到答案,并且测试程序正在制作中,多谢上面 各位 热心的朋友!

---------------
什么原因?我也想知道
种菜的 2007-05-09
  • 打赏
  • 举报
回复
甚么答案说下啊,别光知道问啊。
q44072429 2007-05-09
  • 打赏
  • 举报
回复
谢谢上面的朋友,你们都理解错了,现在的情况和你们说的不是一回事,情况要复杂的多!本来老师只是原理,并且代码又不是什么问题,所以就接了!

上面的问题已经找到答案,并且测试程序正在制作中,多谢上面 各位 热心的朋友!
长尾巴的悟空 2007-05-09
  • 打赏
  • 举报
回复
有老师在,应该不难吧
贵子潘 2007-05-08
  • 打赏
  • 举报
回复
UDP打洞的难点在准确的判断NAT是什么类型(实质上只有两种,可穿透和不可穿透):
贵子潘 2007-05-08
  • 打赏
  • 举报
回复
现在遇到一个问题!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是不可穿透的
贵子潘 2007-05-08
  • 打赏
  • 举报
回复
不管NAT是什么类型的,公网主动连内网都连不上!!
一定要先是内网主动向公网发包了,公网才可以向公网发包的

两个可以穿透的内网是彼此向对方发包,才能建立连接
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧