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