自宅の回線速度を計測する必要があったので.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();
}
コメント