p2p的UDP打动技术的介绍 都是客户端(ClientA,ClientB)使用UDP与服务器通信,服务器获得ClientA的NAT分配的IPA 和 PORTA,ClientB的NAT分配的IPB PORTB,把双方地址与端口告诉对方,安后ClientA借助服务器通知ClientB 往 ClientA方向发送UDP包,ClientA 往 ClientB方向发送UDP包,建立连接。
问 客户端在开始连接服务器时是否能使用TCP连接来获得双方的ip和port
问 客户端在开始连接服务器时是否能使用TCP连接来获得双方的ip和port
解决方案 »
- 辞职中,散分求好运!
- vc代码如何转成oracle存储过程?
- 求教:如何从指针字串变量中读取数据?
- 高分请教VC++下用wininet调用WebService的示例程序。。。
- 关于在vc中使用stl中的vector模板类的问题,请大侠帮忙?
- InstallShield中怎么的到windows的版本?并且怎么是自己安装包中的一个文件不被安装?
- 如何保持同父窗口的6个Popup窗口中的3个始终在另三个的上面
- 一个概念,谢谢!
- 很菜的调用DLL的问题,不过要知道!·
- 简单问题盼指教
- p2p的文件传输是用的什么协议??
- p2p的问题 两个客户端在从服务器得到对方的地址后已建立p2p通讯 还需要和服务器保持心跳连接来维持自己在共网上的地址吗??
ClientA借助服务器通知ClientB 往 ClientA方向发送UDP包,
ClientA 往 ClientB方向发送UDP包,建立连接。借助服务器通知ClientB 往 ClientA方向发送UDP包
是发到 ClientA的NAT分配的IPA 么?双方都通过服务器获取嘞对方的IP和port,怎么还要通过服务器通知b向a发udp, 跟b直接往a发有什么区别么?
A to S: 登录
取好友列表,其中B在线.
发送消息给B,A已经上线啦--->B收到来自S的关于A上线了的通知后,发一个打洞包给A
....
A取完好友列表后,再跟所有在线的兄弟们发一个打洞包,此时应该可以通了.
所以:打洞包不一定要是S发,但S可以起到一种先后区分的作用,如从宏观上讲,还是S告诉B好友A已上线.P.S: P2P之完美解决方案望大家多多讨论啊,俺感觉一般的P2P成功太理想化了,NAT类型何其复杂,俺在同一内网时,只因那网关的NAT不支持环回而惨遭洗白,哎,更不用说那些A-->S 和A-->B,NAT会NEW 一下新端口这么喷饭的事了......
都在不同内网的A和B,要想通信,如A想发数据给B,那末必须是B先发数据给A{1}(可以理解为建立一条B to A的通信链路,实际上UDP是无连接的,但重点在网关上--->在NAT的眼里看来,若B先发了数据给A,那末NAT认为是B主动连接外部的A,所以A发数据来时可以让其进入,转给B),当然这时A可能收不到此数据,因为A的网关发现B发来的数据是不请自来的,它心想:万一是什么黑客数据怎么办呢?于是把它KILL掉了{2},好,这个时候A再发数据给B就能通信成功了{3}。
总结成一句话:)
内网的主机想要被别人访问,首先要主动访问别人。~~~南无阿米陀佛~~~~~~~~~~~~~~~~楼上的施主渗透了么~~~~
我不认同楼上的说法
A to S: 登录
取好友列表,其中B在线.
发送消息给B,A已经上线啦--->B收到来自S的关于A上线了的通知后,发一个打洞包给A
....
A取完好友列表后,再跟所有在线的兄弟们发一个打洞包,此时应该可以通了.
一个NAT洞一般都有超时问题。
总不可能在没发送信息的时候每隔半分钟,都给所有的好友发送一条信息,然后,所有的好友都在
给自己回应一条信息。这样,如果好友超过20个的话 数据流量就不得了了
//你说的也对,不过我的实现不全是你理解的那样:
// 1.具体步骤:[A to S]取第I个好友-->发A上线通知给第I个好友-->好友I发一个包给A--->NEXT;整个取好友的时间如果有一分钟,那末不晓得都取了几千个人回来了,而我用了几秒就取了近百人(每人的资料也不多)
// 2.关于定时检测:这个是必要的,为了维持NAT中的SESSION必须定时发包,一般NAT的失效时间是近两分钟吧,定时检测在线好友:SendHandData(FriendI);sleep(1);这个也不是很吓人啊?!
// 3.关于数据量的问题:定时检测包,我叫它定时握手包,反正就那意思,内容可以只有2个字节,反正作用只是握手(不干别的),应该没有数据量的问题吧?
欢迎讨论。
但是我还没有实际测试(靠,俗务缠身啊)
小星星的解释让我了解了P2P的问题是可以实现的
呵呵
多谢高手啦
:)