日期:2014-05-17  浏览次数:20721 次

【急,17号就要上交了!】谁能跟我讲下这个问题是否需要UDP“打洞”?
是这样,这几天突然发现之前做的一个传送文件的,在自己的电脑上,两个客户端之间发送没有半点问题,
原理是: 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号这个东东就要上交了!!

------解决方案--------------------
哥们,你悲剧了,还是上百度吧,都没人懂这个问题
------解决方案--------------------
A连服务器 S
B连服务器 S
如果A与B都位于不同局域网内。
A与B通信需要打洞。通过服务器端S实现打洞。
udp的打洞的代码网上都已经有了。
可以搜一下。
------解决方案--------------------
pc位于路由器之后,其公网地址是经过nat转换的,进行p2p通信时才需要打洞。如果你的网络是ADSL的,一般都是具有独立的动态变化的公网地址的,这个并不需要打洞,在windows防火墙开启所需的端口,另一端通过服务器获得该pc当时的公网地址,直接连接即可。
如果确实需要穿透,upd穿透的代码如楼上所说,网上非常多。另外你也可以看一下<Windows网络与通信程序设计>这本书,这本书包括了大部分网络编程的内容。
------解决方案--------------------
http://topic.csdn.net/u/20120901/09/33b765ad-8e2e-485f-9722-26e049542c03.html



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



------解决方案--------------------
我找了两年多,没找到一例TCP穿透真正成功的,虽然《Windows网络与通信程序设计》里面有例子。如果一定要用TCP来实现p2p,可以尝试UPNP。
------解决方案--------------------
别乱叫大神,我也没弄过UPNP,只是知道它的原理,并且国内有一些公司在使用它进行TCP的点对点传输。
UPNP需要路由器的支持,要是遇上不支持的那也没办法。Windows有API可以发现并设置支持UPNP的路由器的端口映射。这是链接。
UDP穿透是基本上都能成功的,而且也是采用的最多的。你要保证点对点传输文件的可靠性,就需要参考TCP协议,为UDP写一个保证可靠性的传输和接收机制,写这个保证功能的话难度倒不是很大,但要写的性能很好比较困难。