最近在研究P2P文件传输的东西,使用到了TcpClient与TcpListener还有Socket,但此程序在局域网内使用没有问题,因为可以直接指向接收端的IP地址与端口号,而接收方也可以先将指定端口打开。但此程序在互联网上使用就有点问题了,现在的用户基本上都是内网用户,由路由器通过网关上网,我可以通过一个服务器中转站知道各客户的网关IP地址和使用的端口号,但某农客户端要发送信息时如果向接收方的网关及端口发送请求的话,由于对方网关未打开端口监听,程序老是报错,无法解决。
有人做过可在互联网上使用的P2P程序吗?求解!

解决方案 »

  1.   

    qq有服务器。一些情况下,qq使用服务器中转。对于有的router,可以打洞,但是首次连接还是需要服务器。总之没有什么方案完全不依赖公网的。
      

  2.   

    最近在看C++版的p2p书籍集中式p2p
    完全分布式p2p
    不完全分布式p2p
    混合式p2p
      

  3.   

    第一次连接肯定需要通过服务器获得对方的路径的,我已经获得了对方网关的IP地址,以及网关的端口号,但接下来不知道如何使用TcpClient进行远程连接,有参考资料或代码吗,想参考一下,谢谢!
      

  4.   

    用TCP做P2P不好搞,建议你用UDP。因为需要在路由器上做穿透,也就是所说的NAT 穿透。QQ最初是用UDP做P2P的,现在好像大部分使用TCP通过服务器中转数据的。谁让腾讯有钱呢。用UDP做穿透原理其实很简单,以路由器routA下的节点pcA和路由器routB下的节点pcB进行通讯为例。首先pcA告诉位于外网的服务器我要与pcB建立连接,服务器会接下来通知pcB(前提是服务器已经知道pcB的地址)pcA要和你建立连接,pcB收到服务器的消息后,会主动发起一次与pcA的连接请求(这次连接肯定是失败的,但真正的目的是为了能在路由器的nat中留下一个洞),然后pcA在发起与pcB的连接时就可以成功建立双方的连接。这里只是做了一个很简单的说明,你可以查下Nat穿透。TCP的话需要双方成功建立连接后才可能会在nat上留下洞口,因此用tcp很难做。不过据说也有办法,你自己查查吧。