الحصول على عناوين IPv4 المحلي للكمبيوتر باستخدام VB.net

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

  •  10-07-2019
  •  | 
  •  

سؤال

وأنا أحاول الحصول على عنوان بروتوكول الإنترنت من جهاز الكمبيوتر الخاص بي المحلي، واحدة واحدة من بلدي أجهزة الكمبيوتر الأخرى فإنه يحصل على عنوان غرامة 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 حتى وظيفة فقط الحصول على اتصال عناوين IPv4، وليس 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

وكنت أبحث عن الجواب عن هذا السؤال لنفسي وأنا لا يمكن العثور على واحد مناسب لاحتياجاتي. تمكنت من تجربة إجابات مختلفة عبر الشبكة حتى خطرت لي هذه (يعمل كبيرة!). مجرد التفكير انني سوف تتقاسم منذ هذا المنصب هو نتيجة أعلى عبر جوجل.

    ''''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