2009-10-29 50 views
6

Tôi đang cố gắng lấy địa chỉ IP của máy tính cục bộ và một trong các máy tính khác của tôi có địa chỉ v4, nhưng trên mã này:lấy địa chỉ IPv4 của máy tính bằng cách sử dụng VB.net

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

trả về những gì tôi đoán là một địa chỉ IPv6:

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

làm thế nào để có được địa chỉ IPv4?

Trả lời

9

Disclaimer - Tôi không có cài đặt IPv6 và có lẽ là một cách tốt hơn để làm điều này, nhưng những gì hiện sự trở lại sau:

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

Edit - không để ý bạn đã yêu cầu trong VB, vì vậy tôi đã thử dịch nó sang:

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() 

Điều này có thể nổ tung, vì vậy đừng coi đó là mã sản xuất.

+0

từ đâu đến? –

+0

Jonathan- Tôi không thấy các thẻ VB, do đó, đăng câu trả lời của tôi trong C#. Tôi bây giờ (hy vọng) đã dịch nó thành VB.NET. – RichardOD

+0

cảm ơn, tôi đã nghĩ rằng đó không phải VB :) –

1

Đây là giải pháp của tôi để có được một IP IPv4 định tuyến mà không cần sử dụng một dịch vụ bên ngoài:

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 

Lưu ý rằng mã của tôi cũng được xác minh rằng dãy núi này là định tuyến (IsPrivateIP). Bạn có thể xóa hoặc sửa đổi phần đó nếu bạn đang tìm kiếm một thứ khác.

0

Tôi nghĩ rằng bạn nên sử dụng này:

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

GetHostByName là lỗi thời nhưng đây là cách để có được những IPv4. Tại sao? Vì chức năng getbyhostname được tạo trước IPv6 nên chức năng chỉ nhận được kết nối IPv4, không phải là fe80::9c09:e2e:4736:4c62%11.

0

Something có lẽ niềm vui là chức năng này nhỏ mà sẽ hiển thị tất cả các địa chỉ IP trên máy tính của bạn:

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 
0

tôi đang tìm kiếm câu trả lời cho câu hỏi này bản thân mình và tôi không thể tìm thấy một phù hợp với nhu cầu của tôi. Tôi đã thử nghiệm các câu trả lời khác nhau trên mạng cho đến khi tôi tìm ra câu trả lời này (hoạt động tuyệt vời!). Chỉ nghĩ rằng tôi sẽ chia sẻ vì bài đăng này là kết quả hàng đầu thông qua 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 
0

Trước tiên, bạn cần phải nhập không gian tên hệ thống vào ứng dụng của bạn và sau đó tạo ra một thể hiện của các System.Net.NetworkInformation.IPAddressInformation và sử dụng nó như thế

Ví dụ

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 
+0

Điều này không hoạt động. –

0
Dim localIp As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName()) 
txtLocal.Text = localIp.AddressList(1).ToString 

Lưu ý rằng tôi đã thay đổi chỉ số (0) thành (1).

Các vấn đề liên quan