最近在做一个系统,分为三个端: 服务器端、企业端、验票端, 其中企业端、验票端的数据是
需要同步数据到服务器端的,在网络正常的情况下,企业端、验票端都是以联机的方式进行同步
数据的,脱机状态下不同步数据,网络不正常的情况[丢包严重或直接断网] 企业端、验票端都是
以脱机的方式登陆运行的,脱机状态下是不进行与服务器端同步的,脱机再联机后也不会进行数据同步,
必须重新登陆才行,再加上客户基本上都不习惯关机,24小时开机的,
这样导致服务器端每天查询数据不及时,领导很是不满。
经过再三思考: 决定想法个办法解决问题 我的思路是,写一个后台线程,隔一段时间判断下网络,
如果网络正常就进行数据同步操作
首先我想到了用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;
}
注: 经测试,这两种方法都可以,但是第一种仍有延迟,建议使用第二种方法,响应比较及时
源码下载: JudgeOnLine