关于UDP文件传输的问题,高手请进(100分)

  • 主题发起人 主题发起人 shotgun007
  • 开始时间 开始时间
S

shotgun007

Unregistered / Unconfirmed
GUEST, unregistred user!
先说明一下什么是滑窗算法:滑窗(Sliding Window)是利用缓冲技术和纠错技术对UDP文件传输进行流量控制和差错控制的高级算法,由于UDP是无连接的协议,不能保证数据能够无错到达,所以UDP传输文件需要采用滑窗算法来保证数据的正确性。现在OICQ的最新版本已经采用这种算法来传输文件。UDP可以轻易穿过客户端的网关,甚至各种代理协议,相对于TCP有许多优势。
小弟有个项目需要用UDP进行远程文件传输,为了提高传输效率并保证文件数据的正确性,准备采用滑窗算法,但是要自己从零开始实现滑窗算法实在是太费时间,有没有哪位大虾有现成的算法,或者有比我的方案更好的建议?

我的邮件:dzh@inleo.com
 
直接用TCP发送数据算了,
 
to:张无忌
当传输文件的两端都在内网(就是都在网关内)的时候,由于TCP需要有一方作为服务端,而他们彼此都都不能找到对方的有效IP,从而不能建立TCP连接,无法进行通讯。但是UDP协议却可以连接,这就是为什么非得采用UDP传输文件的原因。
 
to:张无忌

我现在在线,QQ号是:4692928,可直接探讨
 
用UDP可以直接用Indy的TFTP控件做, 免得自己开发,
不过用自己实现滑动窗口和组塞控制需要很多技巧,具体
可以看那3本一套的TCP/IP的书,其中第二本就是TCP的算
法的代码,
 
谢谢张大侠指点,我会看看那本书。不过我的设计就是这样了,一定要实现滑窗算法的。
 
无所谓什么滑窗算法了,
接收方只需要向发送方发送丢失或缺少的包的编号或者已接受到的数据包的编号
发送方重发丢失的包接收方只需要根据包的编号将包放到正确的位置上,
并标记为已接收,就可以了,不一定非得要什么滑窗算法的
 
to :shotgun007
>>当传输文件的两端都在内网(就是都在网关内)的时候,由于TCP需要有一方作为服务
>>端,而他们彼此都都不能找到对方的有效IP,从而不能建立TCP连接,无法进行通讯。
>>但是UDP协议却可以连接,这就是为什么非得采用UDP传输文件的原因。

有点想不通,你使用UDP,如果不知道对方的IP,怎么发送数据给对方呢?
和TCP不是差不多吗?
 
UDP不要连接,每个客户端注册时都向服务器发送数据包,只样服务器就收到了客户端的地址,这个地址不是内网的地址,而是公网网关的地址,另一客户端向该客户端发送数据时,也是往这个网关地址送。
 
同意LiChaoHui的观点,不过那个算法照样可以实现无差错UDP传送文件,
关键在发送方和接收方对文件传送的检验是否正确,如果正确,把收到的流按正确顺序
存放就行了
 
to shotgun007,
原来如此啊,所说的穿透防火墙传递文件也就是这个意思了
 
关注这个问题。
现在正在做语音聊天的,需要这方面的东西。
不过这种实现好像都必须得有一台中间的服务器
啊!
 
所谓穿透防火墙,其实应该是
发送端---->发送端防火墙------>接收端

如果穿透客户端的防火墙,其实应该是一种变相的方法
发送端--->发送端防火墙----->服务器<------>客户端防火墙---->客户端
这里如果没有服务器,你再好的算法,也进不了客户端!
 
to 海风,
那是不是可以这样呢?

发送端--->发送端防火墙<------>客户端防火墙---->客户端
 
其实不是防火墙,而是NAT代理。
 
网关,代理,网络防火墙,NAT代理,实际上说的都是同一种东西
只是表现不同,适用的范围不同罢了
 
发送端--->发送端防火墙<------>客户端防火墙---->客户端
代码:
那是不可能的,除非协议规范改了,否则是不行的
 
to: all

建议大家不要再讨论防火墙的无聊话题,要是没有关于sliding window的心得就别再这里浪费大家的眼神好不好???拜托讲点实质行的东西。
 
有人已经解决了
就是利用qq的服务器+显示ip的qq客户端
然后利用显示出来的那个port号进行通讯,得到防火墙的port以后就不需要qq了。
这个代码要买很多钱哪!
http://wenjinshan.wx-e.com/index2.htm
 
xusong168>
那个原理是这样的:
A,B都没有动态IP
A连接SOCKET5服务器,分配绑定本地端口.然后把服务器的IP和分配的端口告诉B
B直接连接服务器的IP和端口即可.这是TCP协议,并不是UDP的.
http://www.138soft.com/download/iphone.zip

实际上,还是需要一个代理服务器.
http://www.138soft.com/old/htm/socket5.htm

如果不用代理中转
那么只能用UDP
A连接一个站点,比如说WWW.163.COM,这时候在局部网主机会打开一个端口,但是时间会很短,这是因为HTTP协议的缘故.然后自己用一个算法保持它不关闭.B把数据发到A的主机的那个端口即可.因为路由,会转发到A的.

其实我觉得你这个用HTTP隧道技术来实现还好.而且是基于TCP的.
 
后退
顶部