是这样,这几天突然发现之前做的一个传送文件的,在自己的电脑上,两个客户端之间发送没有半点问题,
原理是: 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和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号这个东东就要上交了!!
解决方案 »
- 请教一个对象的问题!!
- c#中遇到“尝试读取或写入受保护的内存”错误(100分)
- 求一份Winform项目需求
- 简易音乐播放器问题
- 迷惑不已的问题!关于radiobutton和checkbox的事件触发!
- C#中八进制常数如何表示?
- 请问各位,如果让在.net下开发的程序,在非.NET平台下运行?
- SOCKET编程
- 做图书管理系统用户权限不论登陆时是什么都是管理员权限 怎么改
- 【求助】如何实现把统一数据库不同表中的数据加入同一个购物车
- SQL不定长数据截调数据后半段
- 检索 COM 类工厂中 CLSID 为 {79AD7B73-C515-40B4-8B02-CB0F5FA5A1A8} 的组件时失败
B连服务器 S
如果A与B都位于不同局域网内。
A与B通信需要打洞。通过服务器端S实现打洞。
udp的打洞的代码网上都已经有了。
可以搜一下。
如果确实需要穿透,upd穿透的代码如楼上所说,网上非常多。另外你也可以看一下<Windows网络与通信程序设计>这本书,这本书包括了大部分网络编程的内容。
两个不同的局域网需要打洞???
那个网上好像我找了很多代码都测试不行...
是否有推荐
而且我希望的是TCP打洞的,因为我要传的是文件....这个不允许丢包!!!!
先谢过~~~
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,这样应该可以连上吧??还是用打洞??
就是局域网内传输文件是可以的...我测试过,但如果不是同一个局域网就不行了!!
青鸟,你那个我早看过了...不知道你是不是没看完我的帖子,我希望的是TCP打洞!
主要的一点
要设置端口重用:
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
UPNP??呵呵,可以详细说下么,大神!
按照我说的流程吗??TCP不都是一端监听,一端连接么这样怎么做到像UDP那样 两端互联
我的基础确实还是不够扎实,不过没办法,要做个东西,需要速成,希望详细指导下
UPNP需要路由器的支持,要是遇上不支持的那也没办法。Windows有API可以发现并设置支持UPNP的路由器的端口映射。这是链接。
UDP穿透是基本上都能成功的,而且也是采用的最多的。你要保证点对点传输文件的可靠性,就需要参考TCP协议,为UDP写一个保证可靠性的传输和接收机制,写这个保证功能的话难度倒不是很大,但要写的性能很好比较困难。
UDP的穿透容易???我看了几段网上的代码,好像都不可以,有没有推荐的?
有成功的UDP源码的么!!!1