在網上查到有幾種方式檢查網絡是否連接,測試了一下,第一種方式受到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("采用網卡上網。");
}