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("采用網卡上網。");   
}  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM