我需要做一个单个计算机不能上网的时候测试网络故障的软件,中间的一个功能,在网上查了好多没有查到,各位大侠给帮忙提点建议吧

解决方案 »

  1.   

    win32   API函数的做法:   
    要用的函数:InternetGetConnectedState   
    函数原形:BOOL   InternetGetConnectedState(LPDWORD   lpdwFlags,DWORD   dwReserved);   
    参数lpdwFlags返回当前网络状态,参数dwReserved依然是保留参数,设置为0即可。   
    INTERNET_CONNECTION_MODEM   通过调治解调器连接网络   
    INTERNET_CONNECTION_LAN   通过局域网连接网络   
    这个函数的功能是很强的。它可以:   
      1.   判断网络连接是通过网卡还是通过调治解调器   
      2.   是否通过代理上网   
      3.   判断连接是On   Line还是Off   Line   
      4.   判断是否安装“拨号网络服务”   
      5.   判断调治解调器是否正在使用   
    这个win32   API在系统system32文件夹中winInet.dll中   
    使用这个判断的话,需要在类中这样写: private   const   int   INTERNET_CONNECTION_MODEM   =   1;   
    private   const   int   INTERNET_CONNECTION_LAN   =   2;   
    [DllImport("winInet.dll")]   
    private   static   extern   bool   InternetGetConnectedState(   
    ref   int   dwFlag,   
    int   dwReserved   
    );   
    //调用的方法(Winform为例,放一个按钮,单击即可):   
    private   void   button1_Click(object   sender,   System.EventArgs   e){   
    System.Int32   dwFlag   =   new   int();   
    if(!InternetGetConnectedState(ref   dwFlag,   0))   
    MessageBox.Show("未连网!");   
    else   
    if((dwFlag   &   INTERNET_CONNECTION_MODEM)!=0)   
    MessageBox.Show("采用调治解调器上网。");   
    else   
    if((dwFlag   &   INTERNET_CONNECTION_LAN)!=0)   
    MessageBox.Show("采用网卡上网。");   
    }  
      

  2.   

    nternetGetConnectedState():对网络状况不能及时反应
    IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。
      

  3.   

    InternetGetConnectedState():对网络状况不能及时反应
    IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。
      

  4.   

    额,还是调用c++中的api啊3楼 应该是正解,上次碰到命名管道的问题,c#也没有,稍微一点底层的东西都得用c++解决。
      

  5.   

    我写过一个,直接可以用
    public sealed class NetworkHelper
        {
            #region 网络状态        /// <summary>
            /// 监听计时器
            /// </summary>
            private Timer listenTimer;
            private static NetworkHelper instance;        /// <summary>
            /// 监听间隔
            /// </summary>
            const int LISTEN_TIME_SPAN = 2000;        //IsNetworkAlive Description
            const int NETWORK_ALIVE_LAN = 1;
            const int NETWORK_ALIVE_WAN = 2;
            const int NETWORK_ALIVE_AOL = 4;        const int FLAG_ICC_FORCE_CONNECTION = 1;
            private NetworkHelper()
            {        }        static NetworkHelper()
            {
                instance = new NetworkHelper();
            }
            public static NetworkHelper GetNetworkHelperInstance()
            {
                return instance;
            }        /// <summary>
            /// 检查网络是否连通,有延迟
            /// </summary>
            /// <param name="connectionDescription"></param>
            /// <param name="reservedValue"></param>
            [DllImport("wininet.dll")]
            private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);        /// <summary>
            /// 
            /// </summary>
            /// <param name="lpszUrl">连接饿地址</param>
            /// <param name="dwFlags">FLAG_ICC_FORCE_CONNECTION</param>
            /// <param name="dwReserved">0</param>
            [DllImport("wininet.dll")]
            private extern static bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved);        /// <summary>
            /// 检查网络是否连通,需要启动服务
            /// </summary>
            /// <param name="connectionDescription"></param>
            [DllImport("sensapi.dll")]
            private extern static bool IsNetworkAlive(out int connectionDescription);        /// <summary>
            /// 检查是否能建立Internet连接,VISTA不可用
            /// </summary>
            /// <param name="dest"></param>
            /// <param name="ptr">0</param>
            [DllImport("sensapi.dll")]
            private extern static bool IsDestinationReachable(string dest, IntPtr ptr);
            /// <summary>
            /// 互联网是否可用
            /// </summary>
            /// <returns></returns>
            public bool IsInternetAlive()
            {
                int status;
                //检查网络是否可用
                if (IsNetworkAlive(out status))
                {
                    //如果WAN可用,检查能否建立连接
                    //if (status == NETWORK_ALIVE_WAN)
                    //{
                    if (InternetCheckConnection("http://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) ||
                        InternetCheckConnection("http://www.sina.com.cn", FLAG_ICC_FORCE_CONNECTION, 0) ||
                        InternetCheckConnection("http://www.163.com", FLAG_ICC_FORCE_CONNECTION, 0))
                    {
                        return true; //如果能建立连接返回TRUE
                    }
                    else
                        return false;
                    //}
                    //else
                    //    return false;
                }
                return false;
            }        /// <summary>
            /// 为NetworkStatusChanged事件处理程序提供数据
            /// </summary>
            public class NetworkChangedEventArgs : EventArgs
            {
                public NetworkChangedEventArgs(bool status)
                {
                    IsNetworkAlive = status;
                }            public bool IsNetworkAlive
                {
                    get;
                    private set;
                }
            }        /// <summary>
            /// 表示NetworkStatusChanged事件的方法
            /// </summary>
            public delegate void NetworkChangedEventHandler(object sender, NetworkChangedEventArgs e);        /// <summary>
            /// 网络状态变更时触发的事件
            /// </summary>
            public event NetworkChangedEventHandler NetworkStatusChanged;        /// <summary>
            /// 网络状态变更时触发的事件
            /// </summary>
            private void OnNetworkStatusChanged(NetworkChangedEventArgs e)
            {
                if (NetworkStatusChanged != null)
                    NetworkStatusChanged(this, e);
            }
            /// <summary>
            /// 监听网络状态
            /// </summary>
            public void ListenNetworkStatus(SynchronizationContext context)
            {
                //获得当前网络状态,并通知
              
                bool currentStatus = IsInternetAlive();
                OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));            //启动监听网络状态,2秒钟检查一次,当状态变更时触发事件
                listenTimer = new Timer(delegate
                                        {
                                            bool tmpStatus = IsInternetAlive();
                                            if (currentStatus != tmpStatus)
                                            {
                                                currentStatus = tmpStatus;
                                                context.Post(delegate { OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); },null);
                                                
                                            }
                                        }
                                        , null
                                        , 0
                                        , LISTEN_TIME_SPAN);        }
            /// <summary>
            /// 停止监听网络状态
            /// </summary>
            public void CloseListenNetworkStatus()
            {
                listenTimer.Dispose();
            }
      

  6.   

    因为有几个API有一定限制,比如有延迟,需要系统支持,需要启动服务,所以我最后选择了
    InternetCheckConnection ,判断常用网站是否可以登录。当然这个也有一定局限,所以更具情况自行选择吧。