PR

VB.NET(VB2022)でLANのIPアドレスを取得する方法

VB.NET
本記事はプロモーションが含まれています。

こんにちは、ENGかぴです。

VB.NET(Visual Basic 2022)のデスクトップアプリでイーサーネット通信を行う準備として自局(自分のパソコン)のIPアドレスを取得する方法として、ネットワークインターフェース及びDNSクラスから取得する方法を紹介します。

以下はVisual Basic 2022をVB2022とします。

VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。

VB.NET(VB2022)のデスクトップアプリ開発でできること

ローカルIPを確認するアプリ

本記事で作成するアプリの動作画面
本記事で作成するアプリの動作画面

フォームを表示する時に使用可能なイーサーネットをコンボボックス(ComboBox)追加して表示します。また検索ボタンを押したタイミングで使用可能なイーサーネットを確認できるようにします。

スポンサーリンク

ComboBoxの追加

Form1.vb[デザイン]にComboBoxを追加します。ツールボックスのすべてのWindows FormsからComboBoxを選択します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。

ComboBoxの追加
ComboBoxの追加

ComboBoxを選択した状態でForm1.vb[デザイン]内を動くマウスのポインタが選択したコントロールのアイコンになるので、左クリックするとボタンが配置されます。左クリックした状態でマウスを移動することでサイズを調整しながら配置することもできます。

マウスによる配置の移動やサイズの移動もできますが、コントロールのプロパティで直接指定する方法もあります。プロパティで直接指定する方法でボタンの位置とサイズを指定する方法を説明します。本記事で使用するプロパティ項目は以下の通りです。

項目説明
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プロパティに文字列を指定します。

広告

コントロールの実装

各種コントロールの追加方法を下記記事にまとめています。

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)に遷移します。次のイベントを追加します。

  1. フォームを呼び出したときに一度だけ処理するLoadイベント
  2. Button1をクリックしたときに呼び出すClickイベント
  3. 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()配列に格納します。

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から取得)
動作確認の結果(DNSから取得)

次に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言語開発環境の作り方までをまとめています。

VSCodeをインストールしてC/C++の開発環境を作る

PR: 未経験OK、20代の理系に特化した就職、転職サービス UZUZ(ウズウズ)

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました