首页 新闻 会员 周边

关于Stream.Read读取时到底使用了多少带宽.?

0
悬赏园豆:50 [已解决问题] 解决于 2013-02-26 10:07
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream receiveStream = response.GetResponseStream();
            byte[] bf = new byte[20];
            int count = receiveStream.Read(bf, 0, 20);
            while (count > 0)
            {
                count = receiveStream.Read(bf, 0, 20);//疑问就在这一句,
                //我想请问一下,Stream.Read()这个方法,工作的时候是如何从互联网上获取信息的,?

                //因为,经过我测试,好像每调用一次Stream.Read(),会从互联网下载64KB左右的信息,(至于储存到哪了,不太清楚)
                //然后直到循环调用Stream.Read()所得到的信息达到64K之后,才会再次从互联网读取64k
                //这是我通过360,以及网卡流量监控软件测试出来的结果,
            }
            receiveStream.Close();
            response.Close();

想请问一下,stream.read 这个方法是如何工作的,

如果真如我猜想的,那么需要如果控制每次下载的信息的大小(即每次下载的64K)

C# IO
只会造轮子的主页 只会造轮子 | 老鸟四级 | 园豆:2274
提问于:2013-02-21 16:27
< >
分享
最佳答案
0

程序中的速度限制没必要做得那么精确,一般来说通过暂停来实现速度限制就可以了。基本方式方式是:

  1. 在程序中加入速度统计功能
  2. 每完成一定数量的任务后暂停一下(这个频度稍微控制一下),计算当前的速度。
  3. 如果当前速度超过预期带宽,则根据当前速度计算需要暂停的时间,超时后后再继续下载。
收获园豆:50
天方 | 大侠五级 |园豆:5407 | 2013-02-21 23:44

你好,感谢你的回复.

其实我目前也是这个方法来实现的,但是Stream有一个缓冲区,我测试了一下,大小大概在64k左右,

也就是说,如果我设置速度为20k,缓冲区会在第一秒直接下载64k的信息,然后后面两秒根本不会下载.

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-22 10:02

@发粪图墙: 

GetResponseStream 函数返回的stream本身是没有缓冲功能的,但操作系统内核是有读缓冲的。

多读的缓冲数据所耗的时间也是非常短的,对于应用程序来说一般是不用感知的。不会像你所假象的那样到了秒级,是不影响你的限速功能的。

另外,感觉你的64k这个数据获取得也不靠谱,你只是获取一些html网页,传输过程中总共都没有64k数据。

天方 | 园豆:5407 (大侠五级) | 2013-02-22 10:56

@天方: 

确实一个网页没有64K的大小,所以我为了测试做了一个很大的页面,放到自己的服务器上,供程序去访问,

64K的数字是我把程序打开以后,测速软件反映出来的结果,

像你说的操作系统中的缓冲大小是否是可以修改的呢?

我的大部分应用都是访问网页,所以想高效的利用带宽,因此想控制带宽的使用速度.

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-22 15:12

@发粪图墙: 

操作系统底层传输有控制的,不会出现一个连接占用大量带宽而其他连接饿死的。

你可以改一下测试方法,对于你那个很大的页面,同时开启100个连接,每个连接只调用一次stream.read函数,看此时的带宽占用是64k还是6400k。

天方 | 园豆:5407 (大侠五级) | 2013-02-22 17:16

@天方: 开启100个连接是肯定达不到6400k的,因为我的宽带没有那么高,

我用了4个连接,每一个读一次的话,就会从64一下增长到250多,然后继续2秒没有下载,再次上升到250.

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-22 20:59
其他回答(2)
0
luofer | 园豆:468 (菜鸟二级) | 2013-02-21 16:48

没看明白,能否详细点.?

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-21 17:52
0
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-02-21 17:28

我是想调整缓存区的大小,目的是为了,控制每秒平均使用带宽,并且实现限制带宽使用率的问题.

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-21 17:55

@发粪图墙: 

这个你要么在站点上设置限流,要么在本地设置限流。貌似

HttpWebRequest 没有限流的API吧?
支持(0) 反对(0) luofer | 园豆:468 (菜鸟二级) | 2013-02-21 18:07

@luofer: API好像是没有,我主要是获取htmlSource使用,貌似C#做这个功能很吃力

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-02-21 18:37

@发粪图墙: 

跟踪自己的应用程序,来调整这个应用程序的流量吗?
为什么不监控整个流量,忙时控制应用程序少发些,闲时就多发些。

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-02-21 23:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册