p2p实现的疑惑。请大家指教,谢谢!

yplin 2004-11-02 03:40:06
最近在写一个P2P的软件,使用的NMUDP,并参考了网上一些文章,文章的大意如下:

1、处于不通局域网内的机器A和B,为了实现P2P通信,A,B首先都登录某一服务器S,服务器S记录他们登录的IP和PORT,并把这些信息返回给A,B。
2、如果此时A想与B进行P2P通信,A首先向服务器发消息:A想与B连接,请转告B。然后A开始向B登录S的IP和PORT持续发送一个要求连接的消息:我想和你连接。
3、与此同时,服务器S转告B:A想与你建立连接。B收到S中转的消息后,开始向A登录S的IP和PORT持续发送消息:我同意你和我建立连接。
4、如果在A,B双方持续发送要求连接的过程中,A收到B的消息,B也收到了A的消息,那么此次连接成功,A和B开始进行P2P的通信。

文章中提到,A->B,B->A发消息时,使用的 目标地址 都是对方登录服务器S时的地址,并且A、B
在互相发送请求连接的过程中,A发出消息到B时的端口仍是A登录服务器S时的端口(例如都是10000),B也同样如此(例如都是20000)。但在实践过程中确发现,A在向B发请求时,A的端口更改了!不再是10000,而是向上加了1,或是更多( 例如是10005),而此时B却并不知道A给它发出请求的端口是多少,B发到A原地址(例如201.22.22.22:10000)的数据就被代理服务器过滤掉了,因为B的数据是不请自来的!!A发到B的数据也是同样下场。这正是我无法解决的问题。

请大家指教。谢谢!!!!!!!!
...全文
241 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ksaiy 2004-11-02
  • 打赏
  • 举报
回复
http://www.delphibox.com/article.asp?articleid=718

http://www.delphibox.com/article.asp?articleid=53
phoenixsharp 2004-11-02
  • 打赏
  • 举报
回复
给你篇文章,看了就知道原因了.原理问题:

http://www.ppcn.net/show.aspx?id=1306&cid=2
pandengzhe 2004-11-02
  • 打赏
  • 举报
回复
没做过,帮你顶。。。
应该有不少人做过
xthmpro_cn 2004-11-02
  • 打赏
  • 举报
回复
我想应该这样:
<如果两机器能直接连通>
2.A向S获取B的IP,和Port,然后通过IP向B请求连接.B收到请求后,相应A即可.
<如果两机器处于不同内网不能直接连通>
2.A向S请求连接B,S将请求连接不的消息转发给A,....S起中转作用.
yplin 2004-11-02
  • 打赏
  • 举报
回复
我所处的网络是小区宽带,每户只有一根线,为了实现多机上网,我自己加了一个宽带路由器。刚才把路由器去掉后试了一下,发现端口不再增加,连接P2P时始终保持8000这个端口(8000是我软件的监听端口,从小区宽带出去后这个值也没有变,比较幸运),看来问题出在路由器上。
yplin 2004-11-02
  • 打赏
  • 举报
回复
谢谢 wxrhb(捡救世主de乞丐) ,你说的通信密钥有点像QQ,QQ给A的所有好友发送一个128位的密文,而只有A有这个密文的密钥,所以只有A才能和这些好友发信息。不过好像和我的问题没什么关系呵,我现在只关心怎样才能连上。

有的P2P软件没有服务器,靠扫描某一端口附近区域的端口实现,不知道具体该怎么做?
wxrhb 2004-11-02
  • 打赏
  • 举报
回复
在p2p通信过程中,有一种情况是A与B不能直接找到对方或者联系到对方的,利用C点转接,这个时候C需要知道A、B的通信密钥以及一些验证信息。也许就是你所说的IP和PORT ~
yplin 2004-11-02
  • 打赏
  • 举报
回复
谢谢各位。上面各位给出的文章链接我以前基本都参看过了。如果把我现在所处的NAT看作Symmetric NAT,那还有没有一种方法可以实现P2P呢?
beyondtkl 2004-11-02
  • 打赏
  • 举报
回复
A.B不能直联么 这样就需要SRV的转发。。。可以考虑做一个SRV APP...

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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