关于P2P的问题,望高手解答下,谢谢!

lirg8405 2011-05-11 04:45:24
我有一个服务器S,IP为:116.252.*.*
然后客户端CA,外部IP为:222.216.*.*
客户端CB,外部IP为:117.141.*.*

然后操作如下:
CA连接服务器,得到外部IP和端口;
CA申请CB建立UDP直连,发送外部IP:222.216.*.*和端口号;
CB正常接收到申请,得到CA的外部IP和端口;
CB连接服务器,得到外部IP和端口;
CB向CA的外部IP地址和端口发送UDP包,这个时候,连接成功了(有的路由是成功的,我这测试的就是这样),但是问题出现了,这个时候,CA的recvfrom得到的IP竟然是服务器S的地址,也就是116.252.*.*,而不是CB的外部地址117.141.*.*;
关键的一步:将recvfrom得到的地址作为新的CB的外部地址,进行后面的通信。

如果进行了上面关键的一步,CA和CB就可以正常通信了,但是CA得到的CB外面IP是服务器的;而CB则可正常得到CA的外面IP;如果不进行上面关键一步,则CB可以向CA发信息,但是CA不能向CB发信息。原因就在于,这时发的地址是117.141.*.*
的。

为什么会这样呢??
CB可以正常得到CA的外部地址,并且按这个地址可以和CA通信;
但是CA得到的CB地址竟然是服务器的,而不是CB从服务器上得到的地址,难道是路由器的问题???
...全文
59 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lirg8405 2011-05-12
  • 打赏
  • 举报
回复
顶一顶,准备睡觉,坐等知情人解答
lirg8405 2011-05-12
  • 打赏
  • 举报
回复
来呀来呀,版主呢???帮看看是什么原因,又或者是我的问题??
下面是你实现P2P的过程:

服务器端:
1、创建一个TCP监听端口,用于和客户端通信;
2、创建一个UDP监听端口,用于接收打洞连接;
3、有客户登录TCO端口,创建一个实例,给定一个唯一标志;
4、有客户发连接UDP申请,收到后,记录下IP和端口,通过标志,在TCP的线路返回IP的端口信息给客户端;

客户端:
1、TCP连接服务器;
2、构建连接申请包,UDP发送给服务器UDP端口;
3、TCP收到回复后,保存自己的UDP与服务器的连接线路的外网IP和端口;
4、取对方的名称(能够让服务器知道是那个客户端的,方便把打洞申请包转发),构建打洞申请包(把自己的UDP外网IP和端口等信息发过去);
5、收到打洞申请的时候,如果没有连接服务器UDP端口,则连接,成功后会得到自己的外网IP和端口;
6、构建打洞包(把自己的外网IP和端口等信息),向申请方的外网IP和端口发送打洞包;
7、如果对方直接收到打洞包,则会处理打洞成功,并且通过TCP线路返回打洞成功应答;
8、如果没收到,则通过几次发送打洞包后,返回打洞已经完成,构建完成包,通过TCP返回完成;
9、如果收到打洞完成包,则取对方发过来的外网IP和端口,构建打洞包,往对方发送UDP包;
10、这个时候,因为对方已经打洞完成了,发送的UDP包对方应该可以收到(假设能成功的话);
11、当对方收到了打洞包,对方标志P2P成功,并且通过TCP线路返回成功;
12、TCP线路得到P2P成功包后,标志P2P成功了。

以上的第6步有可能直接成功的(我测试的环境就是这样),如果不成功,那么就在第9步成功(假设P2P能够成功的话)
我现在觉得不解的是,什么第6步成功了,但是对方得到的外网IP地址会是服务器的,而不是真正自己的外网IP地址???并且以这个服务器地址和端口来发送UDP包,对方竟然能够收到。。。。而往真正的外网IP发包却收不到,就像我上面的说,如果没有关键一步的赋值,P2P就不成功。。。。
上面说的是我实现的大流程,各位大佬看看有什么问题,小弟谢过了。
另小弟准备月未去上海混,不清楚怎么样呢。。。。。。
delphiwcdj 2011-05-11
  • 打赏
  • 举报
回复
Client都首先向Server发送一个hello,表示我上线了,然后Server记录每个Client的IP和端口,再通过Server把这些信息转发给需要相互通信的Client。
lirg8405 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chaigec1 的回复:]
你的ca 和cb之间进行UDP通信要设置好通信端口啊,你获取与服务器通信端口做什么,我做的P2P是这种流程:ca与服务器建立连接后,发送ca进行UDP通信端口和ca的ip给服务器,在cb连接服务器后,服务器把这个ip和端口发送给cb,cb直接recvfrom这个IP和端口即可。因为udp是无连接的,ca可以一开始就发送数据。
[/Quote]
我不明你的。。。。
CA的外部地址不是通过服务器给的难道自己能知道??
CB不绑定自己的本地地址并以此来接收,难道能接收CA的外部地址??
你做的P2P真是的两个不同局域网内的??
宁鸿宝 2011-05-11
  • 打赏
  • 举报
回复
你的ca 和cb之间进行UDP通信要设置好通信端口啊,你获取与服务器通信端口做什么,我做的P2P是这种流程:ca与服务器建立连接后,发送ca进行UDP通信端口和ca的ip给服务器,在cb连接服务器后,服务器把这个ip和端口发送给cb,cb直接recvfrom这个IP和端口即可。因为udp是无连接的,ca可以一开始就发送数据。
lirg8405 2011-05-11
  • 打赏
  • 举报
回复
这个我做的一个类QQ的东东,和服务器通信是用TCP的,所以得到申请包和应答包什么的肯定是没问题的,只是两客户端通信用UDP的,原来一直没成功(正确的说是成功了一边),现在改了上面说的关键一步,并打印出所有通信的IP才发现原因,但是不明白为什么,望高手可以解答下,谢谢了

18,356

社区成员

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

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