ฉันจะตรวจสอบการเชื่อมต่อเครือข่ายได้อย่างไร


111

วิธีใดที่ดีที่สุดในการตรวจสอบว่ามีการเชื่อมต่อเครือข่ายหรือไม่


คำตอบ:


153

คุณสามารถตรวจสอบการเชื่อมต่อเครือข่ายใน. NET 2.0 โดยใช้GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

ในการตรวจสอบการเปลี่ยนแปลงที่อยู่ IP หรือการเปลี่ยนแปลงความพร้อมใช้งานของเครือข่ายให้ใช้เหตุการณ์จากคลาสNetworkChange :

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
สิ่งนี้ดูแล "ความพร้อมใช้งานที่ จำกัด " หรือไม่
tofutim

สิ่งนี้ใช้ไม่ได้ใน WPF เสมอไป แล็ปท็อปบางเครื่องส่งคืนเท็จและบางเครื่องคืนค่าจริง
krilovich

นี่มันเวิร์คจริงเหรอ? ฉันเพิ่งเขียนบรรทัดนี้และปิดเราเตอร์ของฉันและยังคงส่งคืนจริง!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()แอปพลิเคชันของฉันไม่น่าเชื่อถือมาก (.NET 4.5, Windows 10) โดยเฉพาะอย่างยิ่งเมื่อทำงานในเครื่องเสมือน การจัดการเหตุการณ์ที่เกิดขึ้นNetworkAvailabilityChangedมีความน่าเชื่อถือ
eskimwier

ที่ไม่น่าเชื่อถือ. อ่านstackoverflow.com/a/25779403/2377343
T.Todua

174

คำตอบที่ทำเครื่องหมายไว้นั้นใช้ได้ 100% อย่างไรก็ตามมีบางกรณีที่วิธีมาตรฐานถูกหลอกโดยการ์ดเสมือน (กล่องเสมือน, ... ) นอกจากนี้ยังเป็นที่พึงปรารถนาที่จะทิ้งอินเทอร์เฟซเครือข่ายบางส่วนตามความเร็ว (พอร์ตอนุกรมโมเด็ม ... )

นี่คือโค้ดส่วนหนึ่งที่ตรวจสอบกรณีเหล่านี้:

    /// <summary>
    /// Indicates whether any network connection is available
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable()
    {
        return IsNetworkAvailable(0);
    }

    /// <summary>
    /// Indicates whether any network connection is available.
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable(long minimumSpeed)
    {
        if (!NetworkInterface.GetIsNetworkAvailable())
            return false;

        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            // discard because of standard reasons
            if ((ni.OperationalStatus != OperationalStatus.Up) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
                continue;

            // this allow to filter modems, serial, etc.
            // I use 10000000 as a minimum speed for most cases
            if (ni.Speed < minimumSpeed)
                continue;

            // discard virtual cards (virtual box, virtual pc, etc.)
            if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
                (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
                continue;

            // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
            if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
                continue;

            return true;
        }
        return false;
    }

17
สิ่งนี้ถูกต้องและสมควรได้รับการโหวตเพิ่มจำนวนมาก - ฉันพบว่าเหตุการณ์ NetworkAvailabilityChanged ที่กล่าวถึงในคำตอบที่ยอมรับนั้นไม่ได้ทำงานอย่างน่าเชื่อถือซึ่งอาจเกิดจากอะแดปเตอร์เสมือนดังที่กล่าวไว้ในคำตอบนี้
Marek

1
+1 สำหรับการตรวจสอบเพิ่มเติมสำหรับเครื่องเสมือน เพิ่งเจอกรณีนี้เมื่อวานนี้ แต่ฉันยังคิดว่าสิ่งนี้ไม่สามารถจัดการกับ 'Hype-V' ได้เนื่องจากพวกเขาไม่มี 'เสมือน' ในชื่อของพวกเขา
Herdo

3
@ Herdo - ใช่โค้ดไม่สมบูรณ์แบบและฉันไม่คิดว่าจะมีอะไรสมบูรณ์แบบในโลกเสมือนจริง แต่คุณสามารถปรับปรุงได้
Simon Mourier

@SimonMourier คุณพูดถูก แค่อยากทราบว่าหากใครยังคงได้รับการส่งคืนจริงหากไม่มีการเชื่อมต่อ -> อาจเป็นปัญหาได้ :)
Herdo

1
@noelicus - ในโปรเจ็กต์ที่ฉันทำงานอยู่ฉันได้ติดตั้งระบบการตรวจสอบ / การสำรวจความคิดเห็นเป็นระยะ (คำขอ HTTP GET อย่างง่ายเนื่องจากฉันกำหนดเป้าหมายไปที่เว็บเซิร์ฟเวอร์) ซึ่งทำให้เกิดเหตุการณ์เมื่อเซิร์ฟเวอร์ตรวจพบว่า "หยุดทำงาน" (ไม่สามารถเข้าถึงได้ โดย HTTP) หรือ "ขึ้น" (เข้าถึงได้อีกครั้ง) ในกรณีทั่วไปคุณสามารถกำหนดความหมายที่ "เชื่อถือได้" ในกรณีของคุณและใช้ตรรกะที่คล้ายกัน
Simon Mourier

9

Microsoft windows vista และ 7 ใช้เทคนิค NCSI (Network Connectivity Status Indicator):

  1. NCSI ดำเนินการค้นหา DNS บน www.msftncsi.com แล้วขอhttp://www.msftncsi.com/ncsi.txt ไฟล์นี้เป็นไฟล์ข้อความธรรมดาและมีเฉพาะข้อความ ' Microsoft NCSI '
  2. NCSI ส่งคำขอการค้นหา DNS สำหรับ dns.msftncsi.com ที่อยู่ DNS นี้ควรเปลี่ยนเป็น 131.107.255.255 หากที่อยู่ไม่ตรงกันจะถือว่าการเชื่อมต่ออินเทอร์เน็ตทำงานไม่ถูกต้อง

3
นี่เป็นสิ่งที่ดี แต่ในทางเทคนิคไม่ได้เกี่ยวกับความพร้อมใช้งานของ 'เครือข่าย' แต่มีมากกว่านั้น 'ฉันมีการเชื่อมต่ออินเทอร์เน็ตผ่าน http หรือไม่?' คุณสามารถมีการเชื่อมต่อเครือข่ายที่สมบูรณ์แบบ แต่ไม่มีการเชื่อมต่อกับอินเทอร์เน็ตเช่นบน LAN แบบสแตนด์อะโลน ดูข้อมูลเพิ่มเติม OM NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

เรียกวิธีนี้เพื่อตรวจสอบการเชื่อมต่อเครือข่าย

public static bool IsConnectedToInternet()
        {
            bool returnValue = false;
            try
            {

                int Desc;
                returnValue = Utility.InternetGetConnectedState(out Desc, 0);
            }
            catch
            {
                returnValue = false;
            }
            return returnValue;
        }

ใส่โค้ดด้านล่างนี้

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.