C# 使用c语言测量tcp上的数据传输速率#

C# 使用c语言测量tcp上的数据传输速率#,c#,bandwidth,tcpclient,transfer,C#,Bandwidth,Tcpclient,Transfer,我想测量一下当前的下载速度。我正在通过tcp发送巨大的文件。如何捕获每秒的传输速率?如果我使用IPv4InterfaceStatistics或类似的方法,而不是捕获文件传输速率,我将捕获设备传输速率。捕获设备传输速率的问题在于,它通过网络设备捕获所有正在进行的数据,而不是我传输的单个文件 如何捕获文件传输速率?我使用的是c#。因为您无法控制流来告诉他读取了多少,所以您可以在流读取之前和之后设置时间戳,然后根据接收或发送的字节计算速度: using System.IO; using System.

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


如何捕获文件传输速率?我使用的是c#。

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

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
您应该将
流.Read
放在
try/catch
中,并处理读取异常。写入流和计算速度是一样的,只是这两行会受到影响:

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

在接收数据的方法中,每秒钟检查一次所获得的数据量并除以所经过的时间。还是我错过了一些困难?那么,我如何每秒检查我在c#中成功接收了多少数据?也许我错过了什么。我在networkstream中找不到任何相关方法。谢谢,我就是这么做的。这种方法的问题是结果总是比实际值低很多。例如,当我发送数据时,我使用使用IPv4InterfaceStatistics的工具观看设备数据传输。通过这个,我可以看到设备的实际传输速率。当我找到传输速率的平均值时,结果总是低于统计值。我的兴趣是,最大的数据传输,而不是平均的。谢谢。这是您发送或接收的真正有价值的数据。其他层将根据使用协议向数据中添加标题/拖尾。例如,如果使用
SSL
,则设备传输的数据远远超过
实际字节数。此外,还将
OS
数据传输添加到此中(用于
DNS
查询…)。这是控制数据传输的唯一方法。你可以估计你的情况下的过载,并以这个比率乘以这个速度,以获得更接近的速度,但不是精确的速度。我可能遗漏了一些东西,但如果你将它乘以8,你不是在计算千位(Kb/秒)而不是千字节(Kb/秒)吗?@Fidel:你说得对。我的意思是
kbps
,根据需要都应该是小写字母