我现在开发一个C#的网络文件传输小软件,用的Socket,tcp。我想问下怎么控制文件传输的速度。 5
3个回答
展开全部
发送的都是package,一般可能每个package是1K左右。
你可以通过调用同步发送方式,然后自己做个时间计算,2个package之间的时间是多少。
比如,每个package是1k,从上次发送前到现在的时间是5ms。如果现在继续发送的话,那么上个5ms的流量就是1k/0.005s=200k/s。
如果你想限制速度到50k/s,这个时候我们经过计算可以知道,每个package的1k的包,需要20ms。(1000ms/50k/1k=20ms。)那么我们需要sleep(15)等待15ms后再发送。
基于你问题的另外一种理解,你的网络带宽是2M的,那么理论传输速率是2x1024/8=256k/s,如果你只想正常发送的话,中间不需要做任何事情,直接发送,在同步TCP的作用下,每个package都需要发送成功后再返回发送下一个package,那么它会自动使用满整个网络带宽(前提是你和对方的连接足够好,你们之间的连接速率能够达到2M的水平。
你可以通过调用同步发送方式,然后自己做个时间计算,2个package之间的时间是多少。
比如,每个package是1k,从上次发送前到现在的时间是5ms。如果现在继续发送的话,那么上个5ms的流量就是1k/0.005s=200k/s。
如果你想限制速度到50k/s,这个时候我们经过计算可以知道,每个package的1k的包,需要20ms。(1000ms/50k/1k=20ms。)那么我们需要sleep(15)等待15ms后再发送。
基于你问题的另外一种理解,你的网络带宽是2M的,那么理论传输速率是2x1024/8=256k/s,如果你只想正常发送的话,中间不需要做任何事情,直接发送,在同步TCP的作用下,每个package都需要发送成功后再返回发送下一个package,那么它会自动使用满整个网络带宽(前提是你和对方的连接足够好,你们之间的连接速率能够达到2M的水平。
展开全部
可以的。有几种思路:
1、将文件读入到Filestream中,获得Filestream.Length,然后写一个循环,每次发送1KB,直到发送完成。只要文件大小在内存能承受的范围内,就可以这么做。1KB的发送,即使最烂的网络,只要不断就不会丢包。
2、将文件分批次读入到Filestream中,然后发送,然后再读,再发送....理论上,这样可以发送的文件大小没有限制,目前实测读取和发送的大小必须一致,否则会出错;但是如果有高级的调度算法,应该是没问题的,目前还在研究中...
1、将文件读入到Filestream中,获得Filestream.Length,然后写一个循环,每次发送1KB,直到发送完成。只要文件大小在内存能承受的范围内,就可以这么做。1KB的发送,即使最烂的网络,只要不断就不会丢包。
2、将文件分批次读入到Filestream中,然后发送,然后再读,再发送....理论上,这样可以发送的文件大小没有限制,目前实测读取和发送的大小必须一致,否则会出错;但是如果有高级的调度算法,应该是没问题的,目前还在研究中...
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-12-10
展开全部
csdn还cnblogs 或51aspx上面都有 自己找下呗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询