是这样,这几天突然发现之前做的一个传送文件的,在自己的电脑上,两个客户端之间发送没有半点问题,
原理是: A和server建立了Tcp连接, 保存下了相应的Socket, B也和server建立了Tcp连接
之后A请求给B发送文件的时候,A处开启了监听(自己的IP+开放的端口),然后发送命令给server, server发现了A发来的是要发文件给B,先通过Socket得到A的ip(或者A得到自己的ip发送给server,得到的Ip是一样的), 然后端口是A附加发送过来的,然后server把A开放 ip 和 port都发送给B,然后B收到了Server发来的一段消息,知道了A想发东东给它,如果它接受了,那么B就去连接那个server传过来的ip和port,之后就开始传送文件了.....问题是:
1.本地可以传输,但是两台计算机之间不行了,然后我之前听过人家说UDP打洞,自己不是很懂,不知道是不是因为不是打洞的原因
2.我想知道打洞和不打洞到底是什么区别,我用http://www.ip138.com/查出的ip和服务器得到我的ip是一样的,这个Ip应该就是外网ip吧?这样需要打洞么,但传文件我不希望它丢失,是否可以用TCP的打洞(不知道有没有这种)呵呵,楼主是菜鸟一枚,希望各位大神别喷哈,虚心学习中......
请大家给我一些这个问题的最佳解决方案吧.....我17号这个东东就要上交了!!

解决方案 »

  1.   

    A连服务器 S
    B连服务器 S
    如果A与B都位于不同局域网内。
    A与B通信需要打洞。通过服务器端S实现打洞。
    udp的打洞的代码网上都已经有了。
    可以搜一下。
      

  2.   

    pc位于路由器之后,其公网地址是经过nat转换的,进行p2p通信时才需要打洞。如果你的网络是ADSL的,一般都是具有独立的动态变化的公网地址的,这个并不需要打洞,在windows防火墙开启所需的端口,另一端通过服务器获得该pc当时的公网地址,直接连接即可。
    如果确实需要穿透,upd穿透的代码如楼上所说,网上非常多。另外你也可以看一下<Windows网络与通信程序设计>这本书,这本书包括了大部分网络编程的内容。
      

  3.   


    两个不同的局域网需要打洞???
    那个网上好像我找了很多代码都测试不行...
    是否有推荐
    而且我希望的是TCP打洞的,因为我要传的是文件....这个不允许丢包!!!!
    先谢过~~~
      

  4.   

    http://topic.csdn.net/u/20120901/09/33b765ad-8e2e-485f-9722-26e049542c03.html
      

  5.   

    谈谈我理解的这个UDP打洞,不知道对不对,但我觉得这样的方式貌似用到TCP就不行了我的理解:UDP打洞
    A:客户端1
    B:客户端2
    S:服务器serverA先和S链接,这时候要经过NAT-A转换IP和端口给服务器,这样S就得到了A的IP:PORT, 之后
    S把A的IP:PORT发送给B,这时候,B发送一个“没用的包”给S,使得S也可以得到B的IP+PORT,
    然后紧接着B 去connect 服务器发过来的那个A的IP:PORT包,当链接A的时候,A的NAT会把B发来
    的包“丢弃”,但已经记录下了B的IP:PORT(打了个B->A的洞), 这个时候,S再把B的IP+PORT发给A,然后A去连B的时候(打个A->B的洞),这样两端就连通了......就可以连上了
    但如果是TCP打洞要怎么搞??
    TCP不是开启IP:PORT然后一端监听Listener,等待Accept, 等待另一个人连接你么,根本也不用两端都链接吧???
    我的解决方案是用:A发IP:PORT给S,接着A开启那个IP:PORT的监听服务等待有人链接它,然后S发给B包含A的IP:PORT的信息,然后B去链接那个IP:PORT,这样应该可以连上吧??还是用打洞??
    就是局域网内传输文件是可以的...我测试过,但如果不是同一个局域网就不行了!!
      

  6.   


    青鸟,你那个我早看过了...不知道你是不是没看完我的帖子,我希望的是TCP打洞!
      

  7.   

    TCP打洞也一样的流程
    主要的一点
    要设置端口重用:
    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
      

  8.   

    我找了两年多,没找到一例TCP穿透真正成功的,虽然《Windows网络与通信程序设计》里面有例子。如果一定要用TCP来实现p2p,可以尝试UPNP。
      

  9.   


    UPNP??呵呵,可以详细说下么,大神!
      

  10.   


    按照我说的流程吗??TCP不都是一端监听,一端连接么这样怎么做到像UDP那样 两端互联
    我的基础确实还是不够扎实,不过没办法,要做个东西,需要速成,希望详细指导下
      

  11.   

    别乱叫大神,我也没弄过UPNP,只是知道它的原理,并且国内有一些公司在使用它进行TCP的点对点传输。
    UPNP需要路由器的支持,要是遇上不支持的那也没办法。Windows有API可以发现并设置支持UPNP的路由器的端口映射。这是链接
    UDP穿透是基本上都能成功的,而且也是采用的最多的。你要保证点对点传输文件的可靠性,就需要参考TCP协议,为UDP写一个保证可靠性的传输和接收机制,写这个保证功能的话难度倒不是很大,但要写的性能很好比较困难。
      

  12.   


    UDP的穿透容易???我看了几段网上的代码,好像都不可以,有没有推荐的?
      

  13.   

    就这样沉了吗???
    有成功的UDP源码的么!!!1