用ping命令判斷網路,但是這個實在是太不給力了,延遲時間長,於是我在網上查詢了下,發現可以用調用Windows API 內建的兩個動態串連庫調用判斷。
1. winInet.dll
2. sensapi.dll
先講第一個吧:
winInet.dll 可以調用 InternetGetConnectedState 方法
sensapi.dll 可以調用 IsNetworkAlive 方法
要想使用這兩個方法,必須先引入動態串連庫,
需要引用命名空間 using System.Runtime.InteropServices;
代碼如下:
方法1:
//引入API函數
[DllImport("wininet.dll")]
public static extern bool InternetGetConnectedState(out long lpdwFlags, long dwReserved);
public string JudgeOnLine()
{
int INTERNET_CONNECTION_MODEM = 1;
int INTERNET_CONNECTION_LAN = 2;
int INTERNET_CONNECTION_PROXY = 4;
int INTERNET_CONNECTION_MODEM_BUSY = 8;
int INTERNET_CONNECTION_OFFLINE = 32;
long lfag;
string ResultStr = "";
if (InternetGetConnectedState(out lfag, 0))
ResultStr = "網路連接正常!";
else
ResultStr = "網路連接不可用!";
if ((lfag & INTERNET_CONNECTION_OFFLINE) > 0)
ResultStr += "OFFLINE 本地系統處於離線模式。";
if ((lfag & INTERNET_CONNECTION_MODEM) > 0)
ResultStr += "Modem 本地系統使用數據機串連到互連網。";
if ((lfag & INTERNET_CONNECTION_LAN) > 0)
ResultStr += "LAN 本地系統使用的區域網路串連到互連網。";
if ((lfag & INTERNET_CONNECTION_PROXY) > 0)
ResultStr += "a Proxy";
if ((lfag & INTERNET_CONNECTION_MODEM_BUSY) > 0)
ResultStr += "Modem but modem is busy";
return ResultStr;
}
方法2:
[DllImport("sensapi.dll")]
private extern static bool IsNetworkAlive(out int connectionDescription);
private 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 = "聯機:LAN";
}
if ((flags & NETWORK_ALIVE_WAN) == NETWORK_ALIVE_WAN)
{
outPut = "聯機:WAN";
}
if ((flags & NETWORK_ALIVE_AOL) == NETWORK_ALIVE_AOL)
{
outPut = "聯機:AOL";
}
}
else
{
outPut = "離線:NoOnLine";
}
return outPut;
}
註: 經測試,這兩種方法都可以,但是第一種仍有延遲,建議使用第二種方法,響應比較及時