読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#でローカルマシンのIPアドレスが変更されたことを検出する

アプリをバックグランドで起動させておいてIPアドレスに変化がないのか監視するのもよさそうだったのですが、そんなにクリティカルな問題でもないのでアプリを常駐させるよりも定刻でチェックすればよいという話になりました。

ということで、C#を使ってローカルマシンでIPアドレスが変更されたかどうかを検出させてみましょう。

ローカルマシンのIPアドレスを取得する

ローカルマシンのIPアドレスを取得するには、まず自分自身のホスト名を取得して、ローカルマシンが持っている複数のアドレスを取得します。

var hostName = System.Net.Dns.GetHostName();

var addresses = System.Net.Dns.GetHostAddresses(hostName)
    .Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
foreach (var address in addresses)
{
    Console.WriteLine(address.ToString());
}

ローカルマシンのIPアドレスが変更されたことを検出する

良い手なのか?と聞かれると、微妙かもしれません。前回取得したIPアドレスをテキストファイルで書き出し、現在取得したIPアドレスと比較します。違っていればIPアドレスが変更されたと判断するという仕組みです。

// ローカルマシンの現在のIPアドレスを取得する
var hostName = System.Net.Dns.GetHostName();
var addresses = System.Net.Dns.GetHostAddresses(hostName)
    .Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
foreach (var address in addresses)
{
    Console.WriteLine(address.ToString());
}

// (前回取得したIPアドレスとの比較用)取得できたすべてのIPアドレスを接続する
var text = string.Join(",", addresses.Select(a => a.ToString()));

// 前回取得したIPアドレスと変化があるかどうか調べる
var dirPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
var filePath = Path.Combine(dirPath, "ip_address.txt");
if (File.Exists(filePath))
{
    var beforeText = File.ReadAllText(filePath, UTF8Encoding.UTF8);
    if (text == beforeText)
    {
        Console.WriteLine("前回取得したIPアドレスから変化はありません");
        return;
    }
}

Console.WriteLine("前回取得したIPアドレスから変化がありました");

// 現在のIPアドレスを保存する
File.WriteAllText(filePath, text, UTF8Encoding.UTF8);