[C#] 一定間隔で回線速度を測定するアプリ

スポンサーリンク

自宅の回線速度を計測する必要があったので.NETのアプリケーションを作成してみました。

Windowsタスクスケジューラの方が良かったのかもしれませんが、何となく書いてみました。

C#はあまり書かないのできったないコードだと思いますが誰かの参考になれば幸いです。パラメータチェックや例外処理も全て省略しています。

概要

開始した時点以降の○時ちょうどの度にネット上の適当なファイルをダウンロードして下りのスピードを計測し、ログに書き溜めていくアプリケーションです。

各時間帯毎の回線速度を計測することが目的です。

ダウンロードするファイルのURIを”textBox_URI”で指定し、ダウンロードファイルとログファイルの保存場所を”textBox_DLPath”で指定します。

ダウンロードファイルはある程度のサイズで適当なものを探してください。私は自分のレンタルサーバにアップした50MBのテキストファイルで計測しました。

開始処理

開始ボタンをクリックした時のイベントハンドラです。

現在の時間の次に来る○時ちょうどから1時間置きに動作するタイマーを開始します。

System.Threading.Timerクラスを使用しています。

private void button_Start_Click(object sender, EventArgs e)
{
    DateTime now = DateTime.Now;
    DateTime start = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
    start = start.AddHours(1);
    long dueTime = (long)start.Subtract(now).TotalMilliseconds;
    long period = 60 * 60 * 1000;    // 1 hour
    DownloadPath path = new DownloadPath(textBox_URI.Text, textBox_DLPath.Text);
    MyTimer = new System.Threading.Timer(this.TimerCallback, (object)path, dueTime, period);
}

public void TimerCallback(object state)
{
    DownloadPath path = (DownloadPath)state;
    TimerTask(path.URI, path.LocalFolder);
}
public class DownloadPath
{
    public string URI;
    public string LocalFolder;
    public DownloadPath(string URI, string LocalFolder)
    {
        this.URI = URI;
        this.LocalFolder = LocalFolder;
    }
}

回線速度計測処理

System.Net.WebClientクラスを使用してファイルをダウンロードし、System.Diagnostics.Stopwatchクラスで時間を計測しています。

ダウンロードしたファイルのサイズ、計測した時間をもとにMbpsを計算してログに記録しています。

static void TimerTask(string webPath, string localPath)
{
    string startTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
    string downloadFile = Path.Combine(localPath, "tmp.txt");
    WebClient webClient = new WebClient();
    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();
    webClient.DownloadFile(webPath, downloadFile);
    stopWatch.Stop();

    webClient.Dispose();
    FileInfo fileInfo = new FileInfo(downloadFile);
    string filePath = Path.Combine(localPath, "Log.csv");
    long ms = stopWatch.ElapsedMilliseconds;
    double bps = fileInfo.Length * 8.0 / (ms / 1000.0);
    using (StreamWriter sw = new StreamWriter(filePath, true))
    {
        sw.WriteLine(startTime + "," + stopWatch.ElapsedMilliseconds + "[ms]," + bps / 1000000 + "[Mbps]");
    }
}

停止処理

タイマーを止めています。

private void button_Stop_Click(object sender, EventArgs e)
{
    MyTimer.Dispose();
}

コメント

タイトルとURLをコピーしました