【问题标题】:Measure data transfer rate over tcp using c#使用 c# 测量 tcp 上的数据传输率
【发布时间】:2011-01-09 20:57:00
【问题描述】:

我想测量当前的下载速度。我通过 tcp 发送大文件。我如何捕获每秒的传输速率?如果我使用 IPv4InterfaceStatistics 或类似方法,而不是捕获文件传输率,我会捕获设备传输率。捕获设备传输速率的问题在于它通过网络设备捕获所有正在进行的数据,而不是我传输的单个文件。

如何获取文件传输速率?我正在使用 c#。

【问题讨论】:

  • 在接收数据的方法中,每秒检查你有多少数据并除以已经过去的时间。还是我在这里错过了一些困难?
  • 好吧,我如何检查每秒我在 c# 中成功接收了多少数据?也许我错过了什么。我在网络流中找不到任何相关的方法。谢谢。

标签: c# bandwidth tcpclient transfer


【解决方案1】:

由于您无法控制流来告诉他读取了多少,您可以在流读取之前和之后加上时间戳,然后根据接收或发送的字节计算速度:

using System.IO;
using System.Net;
using System.Diagnostics;

// some code here...

Stopwatch stopwatch = new Stopwatch();

// Begining of the loop

int offset = 0;
stopwatch.Reset();
stopwatch.Start();

bytes[] buffer = new bytes[1024]; // 1 KB buffer
int actualReadBytes = myStream.Read(buffer, offset, buffer.Length);

// Now we have read 'actualReadBytes' bytes 
// in 'stopWath.ElapsedMilliseconds' milliseconds.

stopwatch.Stop();
offset += actualReadBytes;
int speed = (actualReadBytes * 8) / stopwatch.ElapsedMilliseconds; // kbps

// End of the loop

您应该将Stream.Read 放入try/catch 并处理读取异常。写入流和计算速度是一样的,只是这两行受到影响:

myStream.Write(buffer, 0, buffer.Length);
int speed = (buffer.Length * 8) / stopwatch.ElapsedMilliseconds; // kbps

【讨论】:

  • 这正是我所做的。这种方法的问题是结果总是比实际的低很多。例如,当我发送数据时,我使用使用 IPv4InterfaceStatistics 的工具观察设备数据传输。有了这个,我可以看到设备的实际传输速率。当我找到传输速率的平均值时,结果总是低于 IPv4InterfaceStatistics。我的兴趣是,最大数据传输,而不是平均水平。谢谢。
  • 这是您发送或接收的真正有价值的数据。其他层将根据使用协议向您的数据添加标头/尾标。例如,如果您使用SSL,则设备传输的数据远多于actualBytes。还将OS 数据传输添加到此(用于DNS 查询......)。这是您可以控制数据传输的唯一方法。您可以为您的情况估算过载,并将该速度乘以该比率以获得更接近的速度,但不是精确的速度。
  • 我可能遗漏了一些东西,但是如果你将它乘以 8,你计算的不是千字节(KB/秒)而不是千字节(KB/秒)吗?
  • @Fidel:你说得对。我的意思是kbps,根据en.wikipedia.org/wiki/KBPS,应该都是小写字母
猜你喜欢
  • 2019-01-04
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多