[c#] 네트워크 연결을 어떻게 확인합니까?

사용 가능한 네트워크 연결이 있는지 확인하는 가장 좋은 방법은 무엇입니까?



답변

다음을 사용하여 .NET 2.0에서 네트워크 연결을 확인할 수 있습니다 GetIsNetworkAvailable().

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

IP 주소의 변경 또는 네트워크 가용성의 변경을 모니터링하려면 NetworkChange 클래스 의 이벤트를 사용하십시오 .

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


답변

표시된 대답은 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;
    }


답변

Microsoft Windows Vista 및 7은 NCSI (Network Connectivity Status Indicator) 기술을 사용합니다.

  1. NCSI는 www.msftncsi.com에서 DNS 조회를 수행 한 다음 http://www.msftncsi.com/ncsi.txt 를 요청합니다 . 이 파일은 일반 텍스트 파일이며 ‘ Microsoft NCSI ‘ 텍스트 만 포함합니다 .
  2. NCSI는 dns.msftncsi.com에 대한 DNS 조회 요청을 보냅니다. 이 DNS 주소는 131.107.255.255로 확인되어야합니다. 주소가 일치하지 않으면 인터넷 연결이 올바르게 작동하지 않는 것으로 간주됩니다.

답변

네트워크 연결을 확인하려면이 메서드를 호출하십시오.

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


답변