【问题标题】:NetworkStream.Read download progress. In similar to WebClient.DownloadProgressChangedNetworkStream.Read 下载进度。类似于 WebClient.DownloadProgressChanged
【发布时间】:2011-01-31 08:19:17
【问题描述】:

我想知道当前使用 NetworkStream.Read 时的下载进度。甚至可能吗?我必须使用网络客户端吗?

我不想使用 webclient,因为它看起来(我不是 100% 确定)

  1. 我必须创建网络服务器
  2. 我必须创建文件(而不是内存流数据)。
  3. 由于 http 协议限制,我无法正确测量千兆网络的传输速度。

或者,我应该使用 webclient?

仅供参考,我正在构建带宽估算工具。

【问题讨论】:

    标签: c# http webclient bandwidth networkstream


    【解决方案1】:

    有什么问题?

    1. 获取当前时间
    2. 在循环中调用“stream.Read(buffer, 0, buffer.Length);”,直到获得足够的字节来计算正确的速率
    3. 结束时间
    4. 将接收到的字节长度除以下载它们所用的秒数。
    5. 结果 = 字节/秒

    【讨论】:

    • 使用 stream.Read 多次而不是一次存在进程开销。最好的方法是通过提供与预期接收数据相似大小的缓冲区来使用 stream.Read 一次。您的方法的问题是结果不准确并且随着大小的不同而波动。如果使用不同的电脑,结果甚至会有所不同。在所有测试平台中唯一相似的是使用 IPv4InterfaceStatistics.BytesReceived 获得的传输数据量。 IPv4InterfaceStatistics.BytesReceived 的问题在于它捕获了通过 nic 传输的所有数据。继续..
    • 我想要从我的应用程序传输的数据量,而不是同一网卡上的所有数据。仅供参考,我的最终目标是测量最大通道容量,而不是传输良好的数据。由于带宽波动不可预测,我无法使用您提供的简单方法。仅供参考,我在完美的网络条件下(尽可能)使用网络模拟器执行所有这些测量。
    • 由于 stackoverflow 注释不支持多行换行,我无法在此处发布结果。我想说的是,这些结果清楚地显示了不同测试配置之间的波动差异。而且由于它不可预测,我无法从中推断出任何结论。我能说的是,不能使用简单的方法来捕获信道容量。只要该通道未被任何其他连接使用,就可以使用 IPv4InterfaceStatistics.BytesReceived 来测量通道容量。希望这能消除混乱。
    • 嗯。高架?开销是如此之小以至于可以忽略不计,除非您下载非常小的缓冲区。
    • 我并不是说你应该只做一个循环。您需要进行多次迭代,为每次迭代保留字节/秒。然后计算平均值。
    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 2015-12-23
    • 2013-10-03
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2016-05-16
    • 2013-08-23
    相关资源
    最近更新 更多