كيف يمكنني الحصول على عنوان IP للشبكة المحلية لجهاز الكمبيوتر برمجياً؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

أحتاج إلى الحصول على عنوان IP الفعلي للشبكة المحلية للكمبيوتر (على سبيل المثال:192.168.0.220) من برنامجي باستخدام C# و.NET 3.5.لا يمكنني فقط استخدام 127.0.0.1 في هذه الحالة.

ما هي الطريقة الأفضل لعمل هذا؟

هل كانت مفيدة؟

المحلول

وصلةتقول هناك، أضف System.net، واستخدم ما يلي

    //To get the local IP address 
string sHostName = Dns.GetHostName (); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); 
}

نصائح أخرى

إذا كنت تبحث عن نوع المعلومات التي يمكن أن توفرها الأداة المساعدة لسطر الأوامر، ipconfig، فمن المحتمل أن تستخدم مساحة الاسم System.Net.NetworkInformation.

سيقوم نموذج التعليمات البرمجية هذا بتعداد كافة واجهات الشبكة وتفريغ العناوين المعروفة لكل محول.

using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main(string[] args)
    {
        foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() )
        {
            Console.WriteLine("Network Interface: {0}", netif.Name);
            IPInterfaceProperties properties = netif.GetIPProperties();
            foreach ( IPAddress dns in properties.DnsAddresses )
                Console.WriteLine("\tDNS: {0}", dns);
            foreach ( IPAddressInformation anycast in properties.AnycastAddresses )
                Console.WriteLine("\tAnyCast: {0}", anycast.Address);
            foreach ( IPAddressInformation multicast in properties.MulticastAddresses )
                Console.WriteLine("\tMultiCast: {0}", multicast.Address);
            foreach ( IPAddressInformation unicast in properties.UnicastAddresses )
                Console.WriteLine("\tUniCast: {0}", unicast.Address);
        }
    }
}

ربما تكون مهتمًا أكثر بـ UnicastAddresses.

يتطلب استخدام نظام أسماء النطاقات (DNS) تسجيل جهاز الكمبيوتر الخاص بك في خادم DNS المحلي، وهذا ليس صحيحًا بالضرورة إذا كنت متصلاً بشبكة إنترانت، بل ويقل احتمالًا إذا كنت في المنزل مع مزود خدمة الإنترنت (ISP).كما يتطلب أيضًا رحلة ذهابًا وإيابًا عبر الشبكة - كل ذلك لمعرفة معلومات حول جهاز الكمبيوتر الخاص بك.

الطريقة الصحيحة:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface  adapter in  nics)
{
    foreach(var x in adapter.GetIPProperties().UnicastAddresses)
    {
        if (x.Address.AddressFamily == AddressFamily.InterNetwork  && x.IsDnsEligible)
        {
                    Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString());
        }
    }
}

(تحديث 31 يوليو 2015:إصلاح بعض المشاكل مع الكود)

أو لأولئك الذين يحبون مجرد سطر من Linq:

NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork  && adr.IsDnsEligible)
    .Select (adr => adr.Address.ToString());

نظرًا لأن الجهاز يمكن أن يحتوي على عناوين IP متعددة، فإن الطريقة الصحيحة لمعرفة عنوان IP الخاص بك الذي ستستخدمه للتوجيه إلى الإنترنت العام هي فتح مأخذ توصيل لمضيف على الإنترنت، ثم فحص اتصال المقبس بـ تعرف على العنوان المحلي المستخدم في هذا الاتصال.

من خلال فحص اتصال المقبس، ستتمكن من مراعاة جداول التوجيه الغريبة وعناوين IP المتعددة وأسماء المضيفين الغريبة.يمكن أن تنجح الحيلة باستخدام اسم المضيف أعلاه، لكنني لا أعتبرها موثوقة تمامًا.

إذا كنت تعرف أن هناك عنوان IPv4 واحد أو أكثر لجهاز الكمبيوتر الخاص بك، فسيوفر لك هذا واحدًا منهم:

Dns.GetHostAddresses(Dns.GetHostName())
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()

GetHostAddresses يقوم عادةً بحظر مؤشر ترابط الاتصال أثناء قيامه بالاستعلام عن خادم DNS ورمي ملف SocketException إذا فشل الاستعلام.لا أعرف ما إذا كان يتخطى مكالمة الشبكة عند البحث عن اسم المضيف الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top