VB.netを使用してコンピューターのローカルIPv4を取得する

StackOverflow https://stackoverflow.com/questions/1642256

  •  10-07-2019
  •  | 
  •  

質問

ローカルPCのIPアドレスを取得しようとしていますが、他のPCの1つはv4アドレスを取得しますが、このコードでは次のようになります。

Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()

IPv6アドレスと思われるものを返します:

fe80::9c09:e2e:4736:4c62%11

IPv4アドレスを取得するにはどうすればよいですか

役に立ちましたか?

解決

免責事項-IPv6をインストールしていません。おそらくこれを行うためのより良い方法がありますが、次の結果が返されます。

Dns.GetHostEntry(Dns.GetHostName()).AddressList
    .Where(a => !a.IsIPv6LinkLocal && !a.IsIPv6Multicast && !a.IsIPv6SiteLocal)
    .First()
    .ToString();

編集-あなたがVBで尋ねていることに気づかなかったので、私はそれを次のように翻訳しようとしました:

Dim s As String = Dns.GetHostEntry(Dns.GetHostName()).AddressList _
    .Where(Function(a As IPAddress) Not a.IsIPv6LinkLocal AndAlso Not a.IsIPv6Multicast AndAlso Not a.IsIPv6SiteLocal) _
    .First() _
    .ToString()

これは爆発する可能性があるので、本番コードとして扱わないでください。

他のヒント

これは、外部サービスを使用せずにルーティング可能なIPv4 IPを取得するための私のソリューションです。

  Function GetLocalIP() As String
    Dim IPList As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName)

    For Each IPaddress In IPList.AddressList
      'Only return IPv4 routable IPs
      If (IPaddress.AddressFamily = Sockets.AddressFamily.InterNetwork) AndAlso (Not IsPrivateIP(IPaddress.ToString)) Then
        Return IPaddress.ToString
      End If
    Next
    Return ""
  End Function

  Function IsPrivateIP(ByVal CheckIP As String) As Boolean
    Dim Quad1, Quad2 As Integer

    Quad1 = CInt(CheckIP.Substring(0, CheckIP.IndexOf(".")))
    Quad2 = CInt(CheckIP.Substring(CheckIP.IndexOf(".") + 1).Substring(0, CheckIP.IndexOf(".")))
    Select Case Quad1
      Case 10
        Return True
      Case 172
        If Quad2 >= 16 And Quad2 <= 31 Then Return True
      Case 192
        If Quad2 = 168 Then Return True
    End Select
    Return False
  End Function

私のコードでは、範囲がルーティング可能であることも確認していることに注意してください(IsPrivateIP)。他の何かを探している場合は、その部分を削除または変更できます。

これを使うべきだと思う:

 Dim tmpHostName As String = System.Net.Dns.GetHostName()
 myIPaddress = System.Net.Dns.GetHostByName(tmpHostName).AddressList(0).ToString()

GetHostByName は廃止されましたが、これはIPv4を取得する方法です。どうして? getbyhostname 関数はIPv6の前に作成されるため、関数は fe80 :: 9c09:e2e:4736:4c62%11 ではなく、IPv4接続のみを取得します。

おもしろいことは、コンピューター上のすべてのIPアドレスを表示するこの小さな機能です:

Public Function getOwnIp() As String
        Dim hostIP As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
        Dim position As Integer = 0
        Dim ip As String = Nothing
        While ipList < hostIP.AddressList.Length
            ip += hostIP.AddressList(position).ToString & vbCrLf
            position += 1
        End While`enter code here`
        Return ip
    End Function

この質問に対する答えを自分で探していましたが、自分のニーズに合ったものを見つけることができませんでした。私はこれを思い付くまで、ネット上でさまざまな答えを試してみました(うまくいきました!)。この投稿はGoogle経由の上位の結果であるため、共有したいと思いました。

    ''''Routine to fetch IPv4 Network addresses for all local network interfaces.
    Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
    Dim adapter As NetworkInterface
        For Each adapter In adapters
            Dim properties As IPInterfaceProperties = adapter.GetIPProperties()
            If properties.UnicastAddresses.Count > 0 Then
                For Each unicastadress As UnicastIPAddressInformation In properties.UnicastAddresses
                    Dim ip As IPAddress = unicastadress.Address
                    If ip.AddressFamily = AddressFamily.InterNetwork Then
                        ComboBox1.Items.Add(ip.ToString)
                    End If
                Next unicastadress
            End If
        Next adapter

最初にシステム名前空間をアプリケーションにインポートしてから、 System.Net.NetworkInformation.IPAddressInformation のインスタンスを作成する必要があります。そのまま使用する

  Imports system.data.sqlclient
    imports system

Public class Form1
   Dim IPAdd As System.Net.NetworkInformation.IPAddressInformation

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 MsgBox("My IP Address is " & IPAdd.Address.ToString)
    End Sub
End Class
 Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
 txtLocal.Text = localIp.AddressList(1).ToString

(0)インデックスを(1)に変更したことに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top