質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

4682閲覧

【Visual C#】IPアドレスを取得したいのですが正常な取得が出来ません

Kazuya_G

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2021/10/01 23:39

編集2021/10/02 00:58

前提・実現したいこと

現在、ホームネットワークの監視を行えるアプリケーション作成を行っています。
本アプリケーションは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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/01 23:58 編集

外部サイトのURLは自動でリンクされないので、リンクの挿入アイコンで記入してください。 サイトのサンプルでは出来てるんですよね?デバッグはしてみたんですか? [超初心者でもわかるデバッグ方法] https://docs.microsoft.com/ja-jp/visualstudio/debugger/debugging-absolute-beginners?view=vs-2019&tabs=csharp なお、只のデバッグ依頼は非推奨質問になります。 https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。 > 問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。
Kazuya_G

2021/10/01 23:58

デバッグもしました。特に例外などが起きているわけでも無い為、正常値の取得が出来ていないだけです。 言われてみればデバッグ投げやりの質問に近いかもしれません、すみません…
退会済みユーザー

退会済みユーザー

2021/10/02 00:06 編集

デバッグしたのであれば、ソースのどこまでがサンプルとどこまで同じように動いて、どこから違う結果になるか確認出来ますよね?そういう確認した事の情報があるなら、載せてください。
Kazuya_G

2021/10/02 00:07

わかりました、有難う御座います
y_waiwai

2021/10/02 00:09

正しい値とはどういうもので、取得した値はどういうもんなんでしょうか
YAmaGNZ

2021/10/02 00:13 編集

デバッグしたとのことですが、getIPAdd内をステップ実行すれば分かると思うのですがやりました? それに参照先のURLがDNSからのIP取得の記事でローカルIPとは関係なさそうですが間違いじゃないですか?
Kazuya_G

2021/10/02 00:24

すみません、デバッグを甘く見ててステップ実行していませんでした。 あと、参照URLも間違えていました…
退会済みユーザー

退会済みユーザー

2021/10/02 00:26

今からでも遅くないので、超初心者でもわかるデバッグ方法を読んでください。 自力デバッグせずにいちいちここに投げるのは非効率すぎます。
退会済みユーザー

退会済みユーザー

2021/10/02 00:28

> ネットワークプロパティにあるIpv4アドレスを表示させようと、 それは何ですか? ipconfig /all コマンドで取得できる自分の PC にアサインされている IP アドレスのことですか? であれば、「全接続可能ネットワークで同IPアドレス」で不思議はなさそうに思いますが。 ところで、radian さんから依頼されている質問の修正はやる気なしですか? リンクを張るぐらいはすぐにでもできると思うのですが。
Kazuya_G

2021/10/02 00:29

すみません、重ね重ね御礼とお詫び申し上げます
退会済みユーザー

退会済みユーザー

2021/10/02 00:53 編集

お詫びは別にいいので、質問を修正して頂けると助かります。 > 外部サイトのURLは自動でリンクされないので、リンクの挿入アイコンで記入してください。
Kazuya_G

2021/10/02 00:56

わかりました
guest

回答2

0

ベストアンサー

C#

1ipaddress = ip.Address.ToString();

ここで見つけたものでことごとく上書きしているけどいいのですか?

また、「Ipv4アドレスを表示させよう」とのことですが、現状では見つけたもの全てが対象となります。
ipのAddressFamilyを調べて判断すべきかと思います。

投稿2021/10/02 00:15

編集2021/10/02 00:28
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazuya_G

2021/10/02 00:31

上書きしすぎて正しい値を参照できていないということですか…?
YAmaGNZ

2021/10/02 00:34

最初に"192.168.0.1"を見つけてipaddressに代入 次のループで"127.0.0.1"を見つけてipaddressに代入 "192.168.0.1"は消えちゃいますよ
Kazuya_G

2021/10/02 00:42

言われてみればそうですね、2回目のループでも値は変わらずに保持し続けられるものだと思っていました
Kazuya_G

2021/10/02 00:45

ご指摘いただいた内容を参考に修正を施したところ、なんとか表示が出来ました。有難う御座いました
退会済みユーザー

退会済みユーザー

2021/10/02 00:49

取り出したipとメンバ変数ipaddressの値を逐次比較すれば、すぐおかしいと気付きますよね。だからデバッグするように何度も言ってるんですが…
Kazuya_G

2021/10/02 01:01

全くもってお二方の仰る通りです…きちんとデバッグをするように今後精進します
guest

0

今このプログラムを実行しているマシンのipアドレスは把握していますか?
ipconfigや、ネットワークを確認すればわかると思います 
プログラムで取得したアドレスと↑のアドレスが一致していれば成功しているということです
ipアドレス自体がわかってない気がします

投稿2021/10/02 00:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazuya_G

2021/10/02 00:30

Dos窓で事前に確認しましたし、ネットワークプロパティも見ながら取得をしようと試みていました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問