WIN判斷網路是否連通(c/c++)
阿新 • • 發佈:2019-02-02
// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "test.h" #include <Wininet.h> #include <Sensapi.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; void Fun_InternetGetConnectedState() { //#define INTERNET_CONNECTION_MODEM 1 //#define INTERNET_CONNECTION_LAN 2 //#define INTERNET_CONNECTION_PROXY 4 //#define INTERNET_CONNECTION_MODEM_BUSY 8 DWORD flags;//上網方式 BOOL m_bOnline=TRUE;//是否線上 m_bOnline=InternetGetConnectedState(&flags,0); if(m_bOnline)//線上 { if ((flags & INTERNET_CONNECTION_MODEM) ==INTERNET_CONNECTION_MODEM) { cout<<"線上:撥號上網\n"; } if ((flags & INTERNET_CONNECTION_LAN) ==INTERNET_CONNECTION_LAN) { cout<<"線上:通過區域網\n"; } if ((flags & INTERNET_CONNECTION_PROXY) ==INTERNET_CONNECTION_PROXY) { cout<<"線上:代理\n"; } if ((flags & INTERNET_CONNECTION_MODEM_BUSY) ==INTERNET_CONNECTION_MODEM_BUSY) { cout<<"MODEM被其他非INTERNET連線佔用\n"; } } else cout<<"不線上\n"; } void Fun_IsNetworkAlive() { DWORD flags;//上網方式 BOOL m_bOnline=TRUE;//是否線上 m_bOnline=IsNetworkAlive(&flags); if(m_bOnline)//線上 { if ((flags & NETWORK_ALIVE_LAN) ==NETWORK_ALIVE_LAN) { cout<<"線上:NETWORK_ALIVE_LAN\n"; } if ((flags & NETWORK_ALIVE_WAN) ==NETWORK_ALIVE_WAN) { cout<<"線上:NETWORK_ALIVE_WAN\n"; } if ((flags & NETWORK_ALIVE_AOL) ==NETWORK_ALIVE_AOL) { cout<<"線上:NETWORK_ALIVE_AOL\n"; } } else cout<<"不線上\n"; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // TODO: code your application's behavior here. // CString strHello; // strHello.LoadString(IDS_HELLO); // cout << (LPCTSTR)strHello << endl; int i=0; while (TRUE) { cout << "請選擇測試的方式:\n" << "1. InternetGetConnectedState\n" << "2. IsNetworkAlive" << endl; cin >> i; switch(i) { case 1: Fun_InternetGetConnectedState(); break; case 2: Fun_IsNetworkAlive(); break; default: cout << "錯誤!\n"; } cout << endl; } } return nRetCode; } 說明: InternetGetConnectedState():對網路狀況不能及時反應 IsNetworkAlive():可以及時反應網路連通情況,但是需要服務System Event Notification支援(系統預設自動啟動該服務)。使用該函式,需要安裝最新的SDK(如.net的) 微軟文件: http://www.microsoft.com/china/technet/security/topics/serversecurity/tcg/tcgch07n.mspx System Event Notification System Event Notification (SENS) 服務監視並跟蹤計算機事件(如 Windows 登入網路和電源事件)。它還將這些事件通知給 COM+ 事件系統 訂閱者。在 Windows XP 和 Windows Server 2003 上預設安裝並自動執行此服務。 如果 System Event Notification 服務停止,COM+ Event System 服務的訂閱者將不會接收到事件通知,並且會發生以下問題: ? Win32 API IsNetworkAlive() 和 IsDestinationReachable() 將無法執行。這些 API 大多在行動式計算機的移動應用程式中使用。 ? ISens* 介面將無法使用。SENS 登入/登出通知將失敗。 ? SyncMgr (mobsync.exe) 將無法正常執行。SyncMgr 依賴於連線資訊,以及來自 SENS 的網路連線/斷開、登入/登出通知。 ? COM+ EventSystem 試圖向 SENS 通知某些事件時將失敗。 ? Volume Shadow Copy 服務將不能正常載入,這將導致 Windows 備份 API 失敗。