用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;
}
注: 经测试,这两种方法都可以,但是第一种仍有延迟,建议使用第二种方法,响应比较及时