用C#使用API即时判断当前的网络的连接方式

来源:互联网 发布:招聘流程优化方案 编辑:程序博客网 时间:2024/06/08 07:01


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace MeshworkLinkMode
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("使用InternetGetConnectedState对网络连接方式进行判断");
            Console.WriteLine(Fun_InternetGetConnectedState());
            Console.WriteLine("使用IsNetworkAlive对网络连接方式进行判断");
            Console.WriteLine(Fun_IsNetworkAlive());
            Console.ReadLine();
        }

        [DllImport("wininet.dll")]
        private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);

        [DllImport("sensapi.dll")]
        private extern static bool IsNetworkAlive(out int connectionDescription);

        static string Fun_InternetGetConnectedState()
        {
            int INTERNET_CONNECTION_MODEM = 1;
            int INTERNET_CONNECTION_LAN = 2;
            int INTERNET_CONNECTION_PROXY = 4;
            int INTERNET_CONNECTION_MODEM_BUSY = 8;

            string outPut = null;
            int flags;//上网方式
            bool m_bOnline = true;//是否在线

            m_bOnline = InternetGetConnectedState(out flags, 0);
            if (m_bOnline)//在线  
            {
                if ((flags & INTERNET_CONNECTION_MODEM) == INTERNET_CONNECTION_MODEM)
                {
                    outPut = "在线:拨号上网\n";
                }
                if ((flags & INTERNET_CONNECTION_LAN) == INTERNET_CONNECTION_LAN)
                {
                    outPut = "在线:通过局域网\n";
                }
                if ((flags & INTERNET_CONNECTION_PROXY) == INTERNET_CONNECTION_PROXY)
                {
                    outPut = "在线:代理\n";
                }
                if ((flags & INTERNET_CONNECTION_MODEM_BUSY) == INTERNET_CONNECTION_MODEM_BUSY)
                {
                    outPut = "MODEM被其他非INTERNET连接占用\n";
                }
            }
            else
            {
                outPut = "不在线\n";
            }

            return outPut;
        }

        static string Fun_IsNetworkAlive()
        {
            int NETWORK_ALIVE_LAN = 0;
            int NETWORK_ALIVE_WAN = 2;
            int NETWORK_ALIVE_AOL = 4;

            string outPut = null;
            int flags;//上网方式
            bool m_bOnline = true;//是否在线

            m_bOnline = IsNetworkAlive(out flags);
            if (m_bOnline)//在线  
            {
                if ((flags & NETWORK_ALIVE_LAN) == NETWORK_ALIVE_LAN)
                {
                    outPut = "在线:NETWORK_ALIVE_LAN\n";
                }
                if ((flags & NETWORK_ALIVE_WAN) == NETWORK_ALIVE_WAN)
                {
                    outPut = "在线:NETWORK_ALIVE_WAN\n";
                }
                if ((flags & NETWORK_ALIVE_AOL) == NETWORK_ALIVE_AOL)
                {
                    outPut = "在线:NETWORK_ALIVE_AOL\n";
                }
            }
            else
            {
                outPut = "不在线\n";
            }

            return outPut;
        }
    }
}

说明:
InternetGetConnectedState():对网络状况不能及时反应
IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。使用该函数,需要安装最新的SDK(如.net的)