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