如何在 C# 中计算 UDP 传输速率 (kbps)?

Ric*_*ral -2 c# sockets udp rate transfer

首先,我知道 UDP 不是一个可靠的协议,但我需要在 UDP 中做到这一点,而且我知道最终可能会发生的后果。

让我们假设我有一个长byte数组,我将它分成 32 字节的块分成List<byte[]>. 这意味着发送的每个数据包的长度为 32 字节。

这些数据包将foreach循环发送,我不在乎它们是否到达目的地。这意味着我不期待主持人的确认(至少现在是这样)。

我的问题是,我将如何计算服务器在接收数据包时的当前传输速率(最好以 kbps 为单位)?

我对如何实现这样的计算感到有些困惑......

Pat*_*ick 5

如果您的问题是“我如何计算传输速率”,您可以将下载的总字节数除以经过的总秒数。

   bytes
 --------- = transfer rate
  seconds
Run Code Online (Sandbox Code Playgroud)

在 C# 中测量时间的一个好方法是StopWatch类,由于计算机科学中的 K 是 1024(或 2^10),您可以将字节数除以 1024(或移位),然后将其除以秒数下载该数量的千字节所需的时间。


如果您对平均传输速率感兴趣,则需要按时间间隔测量下载的字节数。您可以使用二维列表来完成此操作,其中包含测量点以及下载的字节和花费的时间。为简单起见,将其分解为一个进行计算的类

private readonly Stopwatch watch;
private readonly long[,] average;

public .ctor() {
    // use 10 measure points, for a larger or smaller average, adjust the 10
    average = new long[10, 2];
    watch = Stopwatch.StartNew();
}

public long BytesTransferred {
    set {
        for (int i = average.GetLength(0) - 1; i > 0; --i) {
            average[i, 0] = average[i - 1, 0];
            average[i, 1] = average[i - 1, 1];
        }
        average[0, 0] = sent = value;
        average[0, 1] = watch.ElapsedMilliseconds;
    }
}

public long TransferRate {
    get {
        int l = average.GetLength(0) - 1;
        double bytes = average[0, 0] - average[l, 0];
        double seconds = (average[0, 1] - average[l, 1]) / 1000d;
        return (long)(bytes / seconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的下载方法中,中断一个新线程,创建上述类的一个实例,并BytesTransferred = totalBytes;在每个时间间隔内调用。每次调用 TransferRate 时都会计算 TransferRate。请注意,它是 bytes/s,如果您想要另一个单位,请相应地除以 1024。