こんにちは、ENGかぴです。
VB.NET(Visual Basic 2022)でイーサーネット通信を行う準備として自局(自分のパソコン)のIPアドレスを取得する方法の例として、ネットワークインターフェース及びDNSクラスから取得する方法をまとめました。
Windowsフォームアプリケーション(.NETFramework)のデスクトップアプリを対象としています。以下はVisual Basic 2022をVB2022とします。
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
ローカルIPを確認するアプリ
フォームを表示する時に使用可能なイーサーネットをコンボボックス(ComboBox)追加して表示します。また検索ボタンを押したタイミングで使用可能なイーサーネットを確認できるようにします。
ComboBoxの追加
Form1.vb[デザイン]にComboBoxを追加します。ツールボックスのすべてのWindowsフォームからComboBoxを選択します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。
ツールボックスのComboBoxを選択するとForm1内でマウスのポインタがComboBoxのアイコンなります。この状態で左クリックするとComboBoxが配置できます。左クリックを維持したままマウスのポインタを操作することでサイズを調整しながら配置することもできます。
上記以外にComboBoxの位置やサイズをプロパティで指定する方法があります。左クリックである程度のサイズで配置しプロパティで微調整すると効率よく配置できます。
本記事で使用するプロパティ項目は以下の通りです。
項目 | 説明 |
---|---|
Text | テキストボックスの初期の文字を指定する。 |
Location | フレーム上部左端から見た時のコントロール左上の座標を指定する。 |
Size | コントロールのサイズを指定します。 |
Items | コントロールに含まれる項目の選択肢を操作する。 |
サイズプロパティが小さいと項目によって文字が入りきれず見えなくなるため適切なサイズにすることをお勧めします。以下は使用例です。
Private Sub ComboBoxInit()
ComboBox1.Items.Clear() '現在の項目をクリアする
ComboBox1.Items.Add("あいうえお") 'あいうえおを追加
ComboBox1.Items.Add("かきくけこ") 'かきくけこを追加
ComboBox1.Text = "あいうえお" '初期値をセット
End Sub
ItemsプロパティのClose()メソッドで項目をクリアして、Add()メソッドで選択肢の項目を追加します。Add()メソッドの引数が追加する項目になります。初期項目を表示する場合はTextプロパティに文字列を指定します。
広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール
コントロールの実装
各種コントロールの追加方法を下記記事にまとめています。
VB.net(VB2022)のボタンの実装とイベントの追加方法
ツールボックスからコントロールを追加し、一部のプロパティを変更します。
コントロールの赤文字がサイズ、青文字がロケーションとします。サイズとロケーションは目安なので任意でも問題ありません。
GroupBox2、Button1はGroupBox1内に配置しています。ComboBox1はGroupBox2に配置しています。GroupBoxの左上端を基準にしたロケーションを指定します。
GroupBox1のTextプロパティを「操作盤」に変更します。GroupBox2のTextプロパティを「接続元」に変更します。
Button1はボタンをクリックした時点で使用可能なイーサーネットの検索に使用します。Textプロパティを「検索」に変更し、BackColorプロパティをWebタブからLightGreenに変更します。
変数の宣言
アプリで共通する変数を宣言する場合はフォームクラス内で変数を宣言する必要があります。VBの場合はDimでメモリに変数を割り当てます。
Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Net.Sockets
Public Class Form1
Dim localIp As IPAddress
End Class
Form1クラス直前でインポート(Imports)しているものはネームスペースを使用する意味です。7行目のLocalIpはSystem.NetネームスペースのIPAddressクラスでインスタンス化する宣言になります。インポートしない場合はSystem.Net.IPAddressと記述する必要がありますが、名前の簡素化に従って省略するとネームスペースが自動で追加されます。
例ではアプリ全体で使用するlocalIPをインスタンス化しています。クラス内で宣言した場合はアプリを終了しない限りメモリを割り当てた状態になります。localIPはComboBox1で選択したIPアドレスを格納します。
イベントの追加
ComboBox1などのコントロールに対してイベントを追加します。エディターを選択している状態でF7を押すか、右クリックで表示されるメニュー「コードの表示(C)」を選択するとコードの編集画面(Form1.vb)に遷移します。次のイベントを追加します。
- フォームを呼び出したときに一度だけ処理するLoadイベント
- Button1をクリックしたときに呼び出すClickイベント
- ComboBox1で選択したインデックス番号を取得するSelectedIndexChangedイベント
1のイベントはフォームをダブルクリックすると追加されます。2及び3のイベントは対象のボタンをダブルクリックすると追加されます。
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
'処理を追加
End Sub
自動生成されたサブルーチンの後方にHandles ComboBox1.SelectedIndexChangedのように記述されている部分がイベントの発生要因になります。生成したイベントのサブルーチンに処理を追加します。
イーサーネットの確認
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBoxInit()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ComboBoxInit()
End Sub
フォームの呼び出し及びButton1のクリックイベントでは自作の関数のComboBoxInit()関数を呼び出しています。この関数で使用可能なイーサーネットの確認を行い、ComboBox1に結果を表示します。
Private Sub ComboBoxInit()
Dim i As Integer
Dim str As String = ""
NetWork() 'イーサーネットの確認
ComboBox1.Items.Clear() '現在の項目をクリアする
For i = 0 To LocalNet.Length - 1
str = LocalNet(i).name & " " & "IP:" & LocalNet(i).localip.ToString
ComboBox1.Items.Add(str) '項目を追加
Next
ComboBox1.Text = str '初期値をセット
End Sub
項目を追加する前にItemsプロパティのClear()メソッドで項目をクリアしてから接続可能なイーサーネットの分だけAdd()メソッドで項目を追加しています。初期の項目が空欄にならないようにTextプロパティに指定しています。
ComboBox1で選択した項目情報の確認
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
localIp = LocalNet(ComboBox1.SelectedIndex).localip
End Sub
ComboBox1で項目を変更するとイベントが発生します。SelectedIndexプロパティで選択した項目の番号を取得し使用可能なイーサーネットの情報を格納した配列の番号を指定します。デバッグで選択中の項目のIPアドレスであることの確認を行う際に使用します。
LANのIPアドレスを取得する方法
自局(ローカル)のIPアドレスをネットワークインターフェースから取得する方法、DNSクラスから取得する方法を紹介します。
ネットワークインターフェースから取得する
System.Net.NetworkInformationのネームスペースを使用します。ネットワークインターフェースから取得するとイーサーネット名を含めてIPアドレスを取得することができます。
Private Sub GetNetworkList()
Dim netinterface = NetworkInterface.GetAllNetworkInterfaces
Dim wk(netinterface.Length - 1) As NET_INTERFACE
Dim i As Integer
Dim j As Integer = 0
Dim cnt As Integer = 0
For Each netin In netinterface
If netin.OperationalStatus = OperationalStatus.Up AndAlso
netin.NetworkInterfaceType = NetworkInterfaceType.Ethernet Then
wk(i).name = netin.Name
cnt += 1
Dim ipprperties = netin.GetIPProperties.UnicastAddresses
Dim ipadrs As UnicastIPAddressInformation
If ipprperties IsNot Nothing Then
For Each ipadrs In ipprperties
wk(i).localip = ipadrs.Address
Next
End If
End If
i += 1
Next
ReDim LocalNet(cnt - 1)
For i = 0 To wk.Length - 1
If wk(i).name <> "" Then
LocalNet(j) = wk(i)
j += 1
End If
Next
End Sub
NetworkInterfaceクラスのGetAllNetworkInterfaces()メソッドでローカルネットワークに存在するインターフェース情報が取得できます。使用可能なインターフェースが存在する場合は配列で情報を格納します。
For Each Inで取得したインターフェースの情報を確認します。取得したインターフェースがイーサーネットであり使用可能であればIPアドレスの取得を行います。
OperationalStatusプロパティがOperationalStatus.Up(稼働中のインターフェース)であり、NetworkInterfaceTypeプロパティがNetworkInterfaceType.Ethernet(インターフェースがイーサーネット)であればネットワークのアダプタ名とIPアドレスを取得する要件になります。
Nameプロパティでネットワークのアダプタ名を取得します。
GetIPProperties()メソッドで取得したオブジェクトのUnicastAddressesプロパティでユニキャストのIPアドレスを取得します。For Each Inでインターフェースの情報のIPアドレスを確認します。
取得したネットワークアダプタ名とIPアドレスをLocalNet()配列に格納します。
DNSクラスから取得する
DNSクラス使用するとローカルコンピューターのホスト名からIPアドレスを取得することができます。
Private Sub NetWork()
Dim hostname As String = Dns.GetHostName()
Dim ipadrs = Dns.GetHostEntry(hostname)
Dim wk(ipadrs.AddressList.Length - 1)
Dim cnt As Integer = 0
For Each i In ipadrs.AddressList
If i.AddressFamily = AddressFamily.InterNetwork Then
wk(cnt) = i
cnt += 1
End If
Next
ReDim LocalNet(cnt - 1)
For i = 0 To cnt - 1
LocalNet(i).name = ""
LocalNet(i).localip = wk(i)
Next
End Sub
system.NetネームスペースのDnsクラスのGetHostName()メソッドでローカルコンピューターのホスト名が取得できます。取得したホスト名をGetHostEntry()メソッドの引数に指定することでIPアドレス情報(IPHostEntryのインスタンスipadrs)が取得できます。
AddressListプロパティでIPアドレス情報のリスト(配列)を確認します。リストにはIPv4やIPv6のアドレスなどが含まれているためAddressFamilyプロパティのうちAddressFamily.InterNetwork(IPv4)を指定してIPアドレスを取得します。
取得したIPアドレスをLocalNet()配列に格納します。DNSクラスではネットワークのアダプタ名が取得できないため空欄にしています。
動作確認(デバッグ)
イベントの処理を追加した後は動作確認(デバッグ)を行います。デバッグは実際のアプリケーションの動作を模擬して実行するものです。デバッグの開始はエディタ上部の「▶開始」をクリックすると開始します。
デバッグを開始してフォームが表示されるとComboBox1に使用可能なイーサーネットが表示されています。ネットワークインターフェースからIPアドレスが取得した結果ですが、ネットワークのアダプタ名とIPアドレスが取得できています。
次にDNSからIPアドレスを取得した結果ですが、同様にIPアドレスが取得できています。
外付けのUSBハブを接続するとComboBox1の候補が増えて表示されることや「検索」ボタンで表示が更新されることも確認しています。
コードのデバッグを行う場合は、コードエディタでブレークポイントを置くことで一時的にプログラムを停止させることができます。
ブレークポイントはコードエディターの最左部分をクリックして●マークが表示されれば設置できています。例ではButton1がクリックされた時に発生したイベントの先頭部分にブレークポイントを置いています。この状態でButton1をクリックするとブレークポイントでプログラムが一時停止します。
F11を押すとステップ実行になるため1行ずつ内容を確認しながらデバッグを行うことができます。上部の「▶続行(C)」をクリックするとブレークポイント状態から通常の動作に復帰します。
PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))
ソースコード全体
以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。
Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Net.Sockets
#Const NETINTERFACE = 1
Public Class Form1
Structure NET_INTERFACE
Dim name As String
Dim localip As IPAddress
End Structure
Dim LocalNet() As NET_INTERFACE
Dim localIp As IPAddress 'ComboBoxで選択したIPを格納
Private Sub GetNetworkList()
Dim netinterface = NetworkInterface.GetAllNetworkInterfaces
Dim wk(netinterface.Length - 1) As NET_INTERFACE
Dim i As Integer
Dim j As Integer = 0
Dim cnt As Integer = 0
For Each netin In netinterface
If netin.OperationalStatus = OperationalStatus.Up AndAlso
netin.NetworkInterfaceType = NetworkInterfaceType.Ethernet Then
wk(i).name = netin.Name
cnt += 1
Dim ipprperties = netin.GetIPProperties.UnicastAddresses
Dim ipadrs As UnicastIPAddressInformation
If ipprperties IsNot Nothing Then
For Each ipadrs In ipprperties
wk(i).localip = ipadrs.Address
Next
End If
End If
i += 1
Next
ReDim LocalNet(cnt - 1)
For i = 0 To wk.Length - 1
If wk(i).name <> "" Then
LocalNet(j) = wk(i)
j += 1
End If
Next
End Sub
Private Sub NetWork()
Dim hostname As String = Dns.GetHostName()
Dim ipadrs = Dns.GetHostEntry(hostname)
Dim wk(ipadrs.AddressList.Length - 1)
Dim cnt As Integer = 0
For Each ip In ipadrs.AddressList
If ip.AddressFamily = AddressFamily.InterNetwork Then
wk(cnt) = ip
cnt += 1
End If
Next
ReDim LocalNet(cnt - 1)
For i = 0 To cnt - 1
LocalNet(i).name = ""
LocalNet(i).localip = wk(i)
Next
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBoxInit()
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
localIp = LocalNet(ComboBox1.SelectedIndex).localip
End Sub
Private Sub ComboBoxInit()
Dim i As Integer
Dim str As String = ""
#If NETINTERFACE = 1 Then
GetNetworkList()
#Else
NetWork()
#End If
ComboBox1.Items.Clear() '現在の項目をクリアする
For i = 0 To LocalNet.Length - 1
str = LocalNet(i).name & " " & "IP:" & LocalNet(i).localip.ToString
ComboBox1.Items.Add(str) '項目を追加
Next
ComboBox1.Text = str '初期値をセット
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ComboBoxInit()
End Sub
End Class
Const NETINTERFACE = 1を0に変更するとDNSからIPアドレスを取得する方法に切り替わります。
コントロールの番号やイベントハンドラーなどのプロパティ名などを変更している場合はソースコードのイベントハンドラーをお使いのイベントハンドラーに置き換えてください。
関連リンク
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
マイクロソフトはVisual Studio以外にもVSCodeという便利なエディターを提供しています。下記リンクではVSCodeのインストールの仕方からC言語開発環境の作り方までをまとめています。
PR:無料トライアル実施中【PC専用】AIスライド資料作成ツールの利用:イルシル
最後まで、読んでいただきありがとうございました。