zoukankan      html  css  js  c++  java
  • c# 判断网络是否连接

    在网上查到有几种方式检查网络是否连接,测试了一下,第一种方式受到ping时延的影响,在某些不支持ping的地址或者网段甚至不可用,因此建议采用方法2
     
    1. 调用 cmd 中的 ping 命令,分析输出信息来确定网络是否连接
    
     // 使用 ping 命令来判断 ,txtIP 文本框输入一个有效的远程主机 ip 
      System.Diagnostics.Process  proIP=new  System.Diagnostics.Process(); 
      proIP.StartInfo.FileName="cmd.exe"; 
      proIP.StartInfo.UseShellExecute  =  false; 
      proIP.StartInfo.RedirectStandardInput  =  true; 
      proIP.StartInfo.RedirectStandardOutput  =  true; 
      proIP.StartInfo.RedirectStandardError  =  true; 
      proIP.StartInfo.CreateNoWindow  =  true;// 不显示 cmd 窗口  
      proIP.Start(); 
      proIP.StandardInput.WriteLine("ping  "+this.txtIP.Text.Trim()); 
      proIP.StandardInput.WriteLine("exit"); 
      string  strResult=proIP.StandardOutput.ReadToEnd(); 
      if(strResult.IndexOf("(0%  loss)")!=-1) 
          this.txtShow.Text="Ping  通了! "; 
      else  if(strResult.IndexOf("(100%  loss)")!=-1) 
          this.txtShow.Text=" 无法   Ping  通! "; 
      else 
          this.txtShow.Text=" 数据有丢失! "
         proIP.Close();
     
    2. 使用InternetGetConnectedState () 函数
    这个win32 API 在系统 system32 文件夹中 winInet.dll 中 ,可以用来判断是否联网和上网的方式是 Modem 还是 LAN 等
     
    //使用DllImport需导入命名空间
     using System.Runtime.InteropServices;
     
            //InternetGetConnectedState返回的状态标识位的含义:
            private const int INTERNET_CONNECTION_MODEM = 1;
            private const int INTERNET_CONNECTION_LAN = 2;
            private const int INTERNET_CONNECTION_PROXY   = 4;
            private const int INTERNET_CONNECTION_MODEM_BUSY = 8;
     
            [DllImport( "winInet.dll ")]
           //声明外部的函数:
            private static extern bool InternetGetConnectedState(
                ref  int dwFlag,
                int dwReserved
            );
     
            static void Main(string[] args)
            {
                int dwFlag = 0;
                string netstatus = "";
                if (!InternetGetConnectedState(ref dwFlag, 0))
                    Console.WriteLine("未联网!");
                else
                {
                    if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
                        netstatus += " 采用调治解调器上网 \n";
     
                    if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
                        netstatus += " 采用网卡上网  \n";
     
                    if ((dwFlag & INTERNET_CONNECTION_PROXY) != 0)
                        netstatus += " 采用代理上网  \n";
     
                    if ((dwFlag & INTERNET_CONNECTION_MODEM_BUSY) != 0)
                        netstatus += " MODEM被其他非INTERNET连接占用  \n";
                }
     
                Console.WriteLine(netstatus);
                Console.ReadLine();
            }
    
    
    
    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("采用网卡上网。");   
    }  
    

      

  • 相关阅读:
    在Linux下OpenCV的下载和编译
    安装GDB-ImageWatch ,在QT中查看图像
    linux下对qt编写的程序进行部署
    GOQTTemplate简单介绍
    寻找激光的交叉点
    基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
    图像处理工程师的要求研究
    如何将QT的pro图标修改的更显著一些
    快速阅读《QT5.9 c++开发指南》2
    小米盒子连接老式电脑显示器(VGA接口)
  • 原文地址:https://www.cnblogs.com/wpf123/p/2171524.html
Copyright © 2011-2022 走看看