zoukankan      html  css  js  c++  java
  • C# 网络连接判断

    最近在做一个系统,分为三个端: 服务器端、企业端、验票端, 其中企业端、验票端的数据是

    需要同步数据到服务器端的,在网络正常的情况下,企业端、验票端都是以联机的方式进行同步

    数据的,脱机状态下不同步数据,网络不正常的情况[丢包严重或直接断网] 企业端、验票端都是

    以脱机的方式登陆运行的,脱机状态下是不进行与服务器端同步的,脱机再联机后也不会进行数据同步,

    必须重新登陆才行,再加上客户基本上都不习惯关机,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 

    Mr.Tom@live.cn
  • 相关阅读:
    【Java】【高精度】【组合数】【递推】poj1737 Connected Graph
    【递推】【推导】【乘法逆元】UVA
    【Java】【滚动数组】【动态规划】UVA
    【Java】【高精度】【递推】UVA
    【贪心】【multiset】Tinkoff Challenge
    【递推】【组合数】【容斥原理】UVA
    【递推】【组合计数】UVA
    【组合计数】UVA
    【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains
    【DFS】【贪心】Codeforces Round #411 (Div. 1) C. Ice cream coloring
  • 原文地址:https://www.cnblogs.com/mrtom/p/2397053.html
Copyright © 2011-2022 走看看