关于UDP的NAT打洞

hlt 2006-01-21 03:30:01
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建立的.请问这样有问题吗?)
...全文
251 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alen_ghl 2006-01-23
  • 打赏
  • 举报
回复
NAT记录的洞只能对打洞的IP有效,其他IP必须再打洞
hktl 2006-01-23
  • 打赏
  • 举报
回复
不能这样子做的,
只要是C1和S你所谓心跳的洞,C2突然向C1的这个洞发消息,C1的网关是不接收的,
所以C2要想能成功发送,就必须C1先向C2发消息,所谓打洞就是C1和C2两个之间不断的向对方的端口发通讯消息,直到对方收到为止。

所以你的做法基本上是没什么作用,只是先知道了对方的端口,但C1和C2之间的通讯还是要依靠他们双方去打洞的,
hlt 2006-01-23
  • 打赏
  • 举报
回复
哦,明白,谢谢
hlt 2006-01-22
  • 打赏
  • 举报
回复
因为我的设想是C1通过S转发C2打洞消息是,C2也是向C1与S打好的洞发消息的,所以我就想既然双发已打好洞,就双方通过这个洞通讯.
sakurako 2006-01-22
  • 打赏
  • 举报
回复
服务器是打洞时的中转站,两面洞打好后就不需要了。
Kid4you 2006-01-22
  • 打赏
  • 举报
回复
服务器通知双方打洞,然后可以直接通信
striking 2006-01-22
  • 打赏
  • 举报
回复
另, http://community.csdn.net/Expert/topic/4522/4522838.xml?temp=.8980371
striking 2006-01-22
  • 打赏
  • 举报
回复
1. 基本不可行.

c1 要和 c2 通信, c1在向服务器请求c2的洞的信息的同时, 服务器告诉c2 , c1 欲联系你, c1得到c2的信息后, 先往c2方向发个消息. c2得到服务器的信息后, 也会往c1方向打个洞.
c2 和 c1 的联系 就通过了.
nuaawenlin 2006-01-21
  • 打赏
  • 举报
回复
用UDP,客户端用重叠模式接收的.我有一个全局的SOCKET变量,用来保存监听的SOCKET

//////////////////////////////////////////

udp没有侦听的功能呀,不知道你指的侦听是什么
nuaawenlin 2006-01-21
  • 打赏
  • 举报
回复
我的方法是客户端到服务端通过心跳维持一个洞,而P2P时不用另打洞了
////////////////////////////////////////////////////////////////////

不行,因为这个洞是p2p双方的事情,与服务器没有关系,需要p2p两端向各自的NAT设备申请

18,356

社区成员

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

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