vb.net을 사용하여 컴퓨터의 로컬 IPv4를 얻으십시오
문제
나는 로컬 PC의 IP 주소를 얻으려고 노력하고 있으며 다른 PC 중 하나는 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
.
아마도 재미있는 것은 컴퓨터에 모든 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)
.