前提・実現したいこと
現在、ホームネットワークの監視を行えるアプリケーション作成を行っています。
本アプリケーションはFormを持ち、簡単にネットワークの接続状況・Wi-Fiの接続状況など、ネットワークに関する内容を簡単に監視・設定変更を可能にすることを想定しています。
ネットワークプロパティにあるIpv4アドレスを表示させようと、外部のサイトさんのコード参照先を引用し、これを元に後に実現したいことが有る為クラスを作成しました。
その際、IPアドレスをstringで取り、listBoxへAddした際、サイトさんのコードと取得内容が違い、正しい値が取得できませんでした。
何が原因か御教え頂いても宜しいでしょうか。
発生している問題・エラーメッセージ
Ipv4アドレスが正常に取得できず、全接続可能ネットワークで同IPアドレスが出て仕舞う
該当のソースコード
C#
1 //設定変更を行う前の画面の処理 2 //ネットワーク 3 private void buttonNetworkInformation_Click(object sender, EventArgs e) 4 { 5 //ネットワークインターフェイスを取得する 6 7 //foreach(型名 変数 "in" コレクション) = 変数がコレクションの要素を1つ1つ呼び出すことが可能 8 9 10 11 NetworkInterface[] nif = NetworkInterface.GetAllNetworkInterfaces(); 12 13 form2.LabelTitle.Text = "ネットワーク詳細情報"; 14 15 foreach (NetworkInterface ni in nif) 16 { 17 if (ni.OperationalStatus == OperationalStatus.Up) 18 { 19 //ネットワークインターフェイスの情報を表示する 20 21 PCInformation name, date; 22 name = new PCInformation(); 23 date = new PCInformation(); 24 name.getUserName(); 25 date.getNowDateTime(); 26 27 NetworkInformation network; 28 network = new NetworkInformation(); 29 network.getIPAdd(); 30 31 form2.ListBoxInformation.Items.Add("【情報内容確認】"); 32 form2.ListBoxInformation.Items.Add("ユーザ名:" + name.Name); 33 form2.ListBoxInformation.Items.Add("取得時間:" + date.Now); 34 form2.ListBoxInformation.Items.Add("接続名:" + ni.Name); 35 form2.ListBoxInformation.Items.Add("パソコン説明:" + ni.Description); 36 form2.ListBoxInformation.Items.Add("MACアドレス:" + ni.GetPhysicalAddress()); 37 38 39 //構成情報、アドレス情報を取得する 40 IPInterfaceProperties ipip = ni.GetIPProperties(); 41 42 if (ipip != null) 43 { //foreach (UnicastIPAddressInformation ip in ipip.UnicastAddresses) 44 //form2.ListBoxInformation.Items.Add("Ipv4アドレス:" + ip.Address); 45 //↑これがサイトの掲載コードです。以下、僕の作成したIPを取得させるコードです 46 47 form2.ListBoxInformation.Items.Add("Ipv4アドレス:" + network.IPAddress); 48 49 foreach (System.Net.IPAddress ip in ipip.DnsAddresses) 50 form2.ListBoxInformation.Items.Add("DNSサーバ:" + ip.ToString()); 51 52 foreach (System.Net.IPAddress ip in ipip.DhcpServerAddresses) 53 form2.ListBoxInformation.Items.Add("DHCPサーバ:" + ip.ToString()); 54 55 foreach (GatewayIPAddressInformation ip in ipip.GatewayAddresses) 56 form2.ListBoxInformation.Items.Add("ゲートウェイ:" + ip.Address.ToString()); 57 //改行を設け、情報の見易さを意識 58 form2.ListBoxInformation.Items.Add("\n"); 59 } 60 } 61 else if (ni.OperationalStatus != OperationalStatus.Up) 62 { 63 form2.ListBoxInformation.Items.Add("ネットワークに接続されていません"); 64 form2.ListBoxInformation.Items.Add("\n"); 65 MessageBox.Show("ネットワーク接続を確認して下さい", "重要", MessageBoxButtons.OK, MessageBoxIcon.Error); 66 } 67 form2.ShowDialog(); 68 } 69 } 70
該当のソースコード
C#
1//PCInformationクラスはユーザ名と現在の日付を取得する親クラスです。 2//以下に示すのは親を継承をし、メインフォームで記述してあったIPアドレスを取得させるコードを移植したものです 3 4 class NetworkInformation : PCInformation 5 { 6 Form2 form2 = new Form2(); 7 8 private string ipaddress; 9 10 public void getIPAdd() 11 { 12 NetworkInterface[] nif = NetworkInterface.GetAllNetworkInterfaces(); 13 14 foreach (NetworkInterface ni in nif) 15 if (ni.OperationalStatus == OperationalStatus.Up) 16 { 17 IPInterfaceProperties ipip = ni.GetIPProperties(); 18 19 if (ipip != null) 20 { 21 foreach (UnicastIPAddressInformation ip in ipip.UnicastAddresses) 22 ipaddress = ip.Address.ToString(); 23 } 24 } 25 } 26 27 public string IPAddress 28 { 29 get { return ipaddress; } 30 } 31 } 32 33
試したこと
IPアドレスをStringでなくintで取得させようと"ipaddress = form2.ListBoxInformation.Items.Add(ip.Address));"としましたが、当然取得出来ませんでした。
サイトさんのコード通り書いてもいいのですが、それではクラスを作成し参照する意味を失うので実現させませんでした。
<補足事項>
・サイトさんのコードを元にコードを記述後、自身のアプリケーションに移植しました。
foreach (UnicastIPAddressInformation ip in ipip.UnicastAddresses) form2.ListBoxInformation.Items.Add("Ipv4アドレス:" + ip.Address);
上記のように記述した際には、自身のパソコンのIPアドレスを取得できました。ListBoxに直接Addした場合、192.168.のプライベートアドレスが取得出来ました。
この内容をクラスに記述し、ip.Addressの部分を宣言したprivate string ipaddress;で取得させようと、ipaddress = ip.Address.ToString();とした際に、利用可能なネットワークのIPアドレスがすべて「127.0.0.1」のループバックアドレスが出現しました。
この部分をform2.ListBoxInformation.Items.Add("Ipv4アドレス:" + ip.Address);の時に出現したプライベートアドレスの表示にしたいが、方法が分からないので何か助言を頂ければ、と思い質問しました。
またデバッグを甘く見ていたり、ステップをしていなかったりと詰めの甘さが出て仕舞い多くの方々にご迷惑をお掛けしました。
普段例外が起きないのでいいや、と何処か軽んじていた部分もありましたので気を付けます。
皆さん、ご丁寧に有難う御座いました
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019 (Windowsフォームアプリケーション .NET Framework)
回答2件
あなたの回答
tips
プレビュー