IsNetworkAlive需要服務System Event Notification的支持(系統默認自動啟動該服務),且需要安裝最新的SDK(如.NET)
由API中翻譯:該功能可在Windows XP、2000(或Windows NT 4.0與Internet Explorer 5或更高版本)上使用,在windows95或更高版本上使用Internet Explorer 5或更高版本。所以,一般的系統都是支持的
輸出值lpdwFlags
具體類型的詳細內容可鏈接QOCINFO structure
- NETWORK_ALIVE_LAN=1 局域網(此處並非指有線網)
- NETWORK_ALIVE_WAN=2 遠程訪問-撥號訪問和vpn訪問(此處並非只無線網,按DPI所示,指的是RAS connections)
- NETWORK_ALIVE_AOL=4 無效的值。。。因為只有Win9x系統才有此第三個選項。參考鏈接
無線網絡的判斷:lpdwFlags對是否無線網絡,並沒有直接的判斷。
eg:比如我的電腦環境(有線網絡或者wifi網絡),獲取的flag=1(局域網)
返回值(bool)
- 當返回值為true,且無錯誤Code時,表示網絡已連接
- 當返回值為false,且無錯誤Code時,表示網絡未連接
那么,錯誤Code(異常)怎么獲取呢?
獲取上一次異常Code-GetLastError
此處推薦使用Marshal中的GetLastWin32Error,見如下源代碼:
1 /// <summary> 2 /// 通過使用平台調用的最后一個非托管函數返回的錯誤代碼返回調用具有 <see cref="F:System.Runtime.InteropServices.DllImportAttribute.SetLastError" /> 標志設置。 3 /// </summary> 4 /// <returns>最后一個錯誤代碼設置通過調用 Win32 SetLastError 函數。</returns> 5 [SecurityCritical] 6 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 7 [MethodImpl(MethodImplOptions.InternalCall)] 8 public static extern int GetLastWin32Error();
GetLastWin32Error可獲取最后一個非托管函數的錯誤Code
int errCode = Marshal.GetLastWin32Error();
--獲取 error code的詳細描述信息,可參考https://my.oschina.net/kavensu/blog/264273
值得注意的是,非托管函數聲明時,要添加SetLastError=true;如:
1 [DllImport("sensapi.dll", SetLastError = true)] 2 private static extern bool IsNetworkAlive(out int connectionDescription);
網絡狀態准確性
IsNetworkAlive電腦網絡判斷不准確,案例:
- 電腦配置了虛擬機連接--將當前的以太網禁用后,IsNetworkAlive返回的是有網true -- 將虛擬機的本地網絡適配器當成了可用的網絡連接,但是電腦其實是沒有網絡的
- 在某些情況下,光纖等壞了,上不了網絡,但是走TCP協議可以聊微信QQ,IsNetworkAlive返回的也是有網true
IsNetworkAlive對網絡類型判斷也不准確,雖然可以通過lpdwFlags枚舉值判斷網絡類型。
無網絡時,有可能返回有網:lpdwFlags=1 局域網時,如果當前配置了虛擬機連接之類的,本機無法連接網絡時,IsNetworkAlive函數還是會返回true。如下:
所以,IsNetworkAlive僅可使用簡單場景下的網絡判斷