问题如下:
clientA(简称A)通过代理proxyA(简称PA)连接到服务器(同时有TCP连接和UDP连接),服务器记录A在公网的映射IP和端口(简称A.IP和A.Port)
同理clientB相同情况通过proxyB连接到服务器.现在A要与B通信,需要B先给A打个洞.但是B的UDP给A.IP+A.Port发送数据包的时候会出现错误,提示是connection reset by peer.不知道怎么回事.哪位达人给解答一下?同时也说说UDP穿透NAT的时候的一些问题吧.小子先谢了.
TCp连接用的是
IDTCPServer和IDTCPClient.UDP通信只用了IDUDPServer.

解决方案 »

  1.   

    呃...还是有地方没说明白.
    A.IP和A.Port是A的UDP连接的映射IP和端口
      

  2.   

    >>穿透必须有服务器做中转。必须靠服务器来传递数据包!
    那就不叫P2P了吧??
      

  3.   

    自然会出错!因为实际上这个socket没有建立连接!
    B在给A打洞的时候,需要服务器做一下周转。就A先发送一个不可能被B收到的UDP消息;
    但是这个洞,就开了!然后把A这个洞的信息给服务器,服务器给B,B就可以利用这个洞了!p2P宣告成功。目前我也在做。敬请等候代码!
      

  4.   

    对,的确是没有连接,但是问题在于如何打这个洞?
    b给a发送udp包本来目的就是为了打这个洞,收不到很正常.但是之后a再给b发的udp包仍然是出了这个问题,还是没有让对方收到.如此下去两边还是不能通信啊.
    这个洞要如何打??
      

  5.   

    这是因为a给b的IP和端口不被你的nat接受!就是说,你是使用服务器纪录的a和b的Ip和端口。nat会不认的,因为服务器纪录的是这个通向服务器的洞,当然只会认识服务器的ip,别的ip过来的udp就被丢掉了!
      

  6.   

    楼上没有了解清楚问题好像
    littlefishli说的问题是
    a->s,从而s知道了ip-a和port-a,同理,也知道了ip-b和port-b
    然后a向ip-b:port-b发送一个消息,这个消息当然会被丢掉,但是a的NAT是不是应该已经搭好这个洞了,b再向ip-a:port-a发过来的消息a就能收到了呢?
    我遇到了一种现象,就是a向server发送的port-a和它向其他客户端发送的port,经过NAT之后是不同的。比如a->s1,s1收到的是ip-a:port-a1,同时再运行一个s2,a->s2,s2收到的是ip-a:port-a2。那么这样的话,a->s与a->b的端口也是不同的,那么这样的洞该如何打?
      

  7.   

    现在问题细化了...
    a通过代理给b的代理发送udp数据包,a要怎么才能知道自己的代理分配的端口?
      

  8.   

    这个问题需要看网关的NAT方式,有两种情况:
      1.C1-->S1和C1-->C2时,NAT不会新生成一个端口,只会增加一个新的SESSION会话.这点让大家省了不少麻烦.(目前大多数都是这个类型的.)
      2.C1-->S1后再C1-->C2时,NAT会重新分派一个新的端口,如C1-->(GATEWAY--NAT:3001)--S1,C1再发数据到C2时,端口可能变得3002或者其它,这时就比较麻烦,可以通过一个猜测法,但不能保证,也许是因为UDP本身就不能保证.
       但所幸的是大多数情况都是情况1.
      

  9.   

    a通过代理给b的代理发送udp数据包,a要怎么才能知道自己的代理分配的端口?
    你说的A.IP,A.Port就是代理的,并不是你A的真正IP,Port!我在这里问一个问题 UDP通信只用了IDUDPServer是怎么回事?
    难道你的Server端,Client端都用IDUDPServer控件,那么IDUDPServer和IDUDPServer能建立通信?
    这个我还从来没有想过ps:如果是TCP的话好像难很多把,nat映射的端口有效是在连接的时候,断开后就无效了,你怎么处理?
      

  10.   

    to  littlefishli(凉水塞牙~) :
       A-->GateWay-->B:
         A-->S: S.PeerIP为A的网关IP;
         S-->B: S
      to  constantine(飘遥的安吉儿; 
      IDUDPServer更多的是接收功能,当然它也能发,无连接的.不管谁发的,只要能到达就能收.
    IDUDPServer和IDUDPServer当然可以通信.
      

  11.   

    S-->B:告诉B ,A的公网地址,S也可告诉A,B的公网地址. A和B谈恋爱,S是媒人,需要拉线介绍,但A和B谈起来了,媒人就不起作用了.当然出了问题再出来调解.....
      

  12.   

    idudpserver也可以sendbuffer,为什么不可以用?
      

  13.   

    小星星:介绍人介绍了,父母不同意怎么办?Nat还是要把门的!
      

  14.   

    我倒,按现在的时代来说,都是自由恋爱啊--网关只是起一个NAT作用,一般没有太多的限制,就好比你访问任何一个网站一样,它只负责把你的内网IP转换成自己的IP:PORT,然后将访问某网站的请求发出去,收到后再回发给内网的你,...
     谈恋爱的过程一般是这样子的:
       A-->B:A发了数据包给B,表示A送了一朵花给B,这时B有机会与A进行#@$%^&了.
       基本上的原理就是,B要想和内网的A交流,必须先让A发一个给B的数据包,打这样一个洞,
     但是有些NAT的类型为A-->S和A-->B发的数据NAT会分派不同的PORT,这个就比较痛苦了.希望大家进来讨论一下如何实现比较优良的P2P通信.....
      

  15.   

    对于小星星说的确实很麻烦,基本上如果是重新分配一个端口的话,那么很多p2p软件都不能用
    vc有人做了一个模仿msn的软件,按作者说的几乎可以穿透一切nat,不过他就是没有怎么做的
    软件叫:LinQ
      

  16.   

    结了吧```
    这是要看对方的网关是怎么样的一个方式,如果是clon的话,你直接这样利用服务器给A B的公网的IP和端口的话,是没有用的,B的网关就会把A的数据给丢了,不安全嘛!
    如果B的网关是Full Clon的话,就可以了!!所以P2P,在A这边是发两个信息的``一个通过服务器,另外一个直接发~~~