最近在写一个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的数据也是同样下场。这正是我无法解决的问题。请大家指教。谢谢!!!!!!!!

解决方案 »

  1.   

    我想应该这样:
    <如果两机器能直接连通>
    2.A向S获取B的IP,和Port,然后通过IP向B请求连接.B收到请求后,相应A即可.
    <如果两机器处于不同内网不能直接连通>
    2.A向S请求连接B,S将请求连接不的消息转发给A,....S起中转作用.
      

  2.   

    给你篇文章,看了就知道原因了.原理问题:http://www.ppcn.net/show.aspx?id=1306&cid=2
      

  3.   

    http://www.delphibox.com/article.asp?articleid=718http://www.delphibox.com/article.asp?articleid=53
      

  4.   

    A.B不能直联么 这样就需要SRV的转发可以考虑做一个SRV APP...
      

  5.   

    谢谢各位。上面各位给出的文章链接我以前基本都参看过了。如果把我现在所处的NAT看作Symmetric NAT,那还有没有一种方法可以实现P2P呢?
      

  6.   

    在p2p通信过程中,有一种情况是A与B不能直接找到对方或者联系到对方的,利用C点转接,这个时候C需要知道A、B的通信密钥以及一些验证信息。也许就是你所说的IP和PORT ~
      

  7.   

    谢谢  wxrhb(捡救世主de乞丐) ,你说的通信密钥有点像QQ,QQ给A的所有好友发送一个128位的密文,而只有A有这个密文的密钥,所以只有A才能和这些好友发信息。不过好像和我的问题没什么关系呵,我现在只关心怎样才能连上。有的P2P软件没有服务器,靠扫描某一端口附近区域的端口实现,不知道具体该怎么做?