关于UDP的NAT打洞
1. 我上网看到CONE方式打洞是通过服务端转发打洞消息到对方客户端,再由对方客户端返回消息到源客户端的洞.以完成双方打洞过程.但我想了另一种方法,但不知可不可行,我的方法是客户端到服务端通过心跳维持一个洞,而P2P时不用另打洞了.如C1向服务端心跳,服务端记录C1的洞.C2也是一样.当C2与C1通讯时,只要向服务端请求C1的打洞信息,就住C1的洞发消息,C1要发消息,也向服务端请求C2的洞的信息.这种方式不知可不可行,请大家给点意见.
2.我是做一个点对点对聊程序,用来学习P2P的.用UDP,客户端用重叠模式接收的.我有一个全局的SOCKET变量,用来保存监听的SOCKET,因为要定时向服务端打洞.所以我必需要用这SOCKET向服务端打洞.因为我UDP监听是通过循环WSARECVFROM阻塞来达到监听的目的,我尝试在另一线程通过该SOCKET向服务端打洞.但每次都在SENDTO时被阻塞.若我不用监听,则可以顺利发送.请问有什么方法可以使该SOCKET可以双工运行?(不过我的发送是用SENDTO而不是WSASENDTO,而SOCKET是用WSASOCKET建立的.请问这样有问题吗?)
问题点数:50、回复次数:10Top
1 楼nuaawenlin(飘人)回复于 2006-01-21 20:02:40 得分 6
我的方法是客户端到服务端通过心跳维持一个洞,而P2P时不用另打洞了
////////////////////////////////////////////////////////////////////
不行,因为这个洞是p2p双方的事情,与服务器没有关系,需要p2p两端向各自的NAT设备申请Top
2 楼nuaawenlin(飘人)回复于 2006-01-21 20:03:51 得分 6
用UDP,客户端用重叠模式接收的.我有一个全局的SOCKET变量,用来保存监听的SOCKET
//////////////////////////////////////////
udp没有侦听的功能呀,不知道你指的侦听是什么Top
3 楼striking(庸人自扰)回复于 2006-01-22 14:03:14 得分 7
1. 基本不可行.
c1 要和 c2 通信, c1在向服务器请求c2的洞的信息的同时, 服务器告诉c2 , c1 欲联系你, c1得到c2的信息后, 先往c2方向发个消息. c2得到服务器的信息后, 也会往c1方向打个洞.
c2 和 c1 的联系 就通过了.Top
4 楼striking(庸人自扰)回复于 2006-01-22 14:03:41 得分 6
另, http://community.csdn.net/Expert/topic/4522/4522838.xml?temp=.8980371Top
5 楼Kid4you(Kid4you)回复于 2006-01-22 14:32:40 得分 5
服务器通知双方打洞,然后可以直接通信Top
6 楼sakurako(看晨雾散开,你就是我一生的最爱...)回复于 2006-01-22 15:41:06 得分 6
服务器是打洞时的中转站,两面洞打好后就不需要了。Top
7 楼hlt(入门小弟弟)回复于 2006-01-22 20:01:45 得分 0
因为我的设想是C1通过S转发C2打洞消息是,C2也是向C1与S打好的洞发消息的,所以我就想既然双发已打好洞,就双方通过这个洞通讯.Top
8 楼hktl(風)回复于 2006-01-23 10:06:54 得分 7
不能这样子做的,
只要是C1和S你所谓心跳的洞,C2突然向C1的这个洞发消息,C1的网关是不接收的,
所以C2要想能成功发送,就必须C1先向C2发消息,所谓打洞就是C1和C2两个之间不断的向对方的端口发通讯消息,直到对方收到为止。
所以你的做法基本上是没什么作用,只是先知道了对方的端口,但C1和C2之间的通讯还是要依靠他们双方去打洞的,Top
9 楼alen_ghl(东方求*)回复于 2006-01-23 11:14:15 得分 7
NAT记录的洞只能对打洞的IP有效,其他IP必须再打洞Top
10 楼hlt(入门小弟弟)回复于 2006-01-23 13:48:18 得分 0
哦,明白,谢谢Top




