1. 程式人生 > >WIN判斷網路是否連通(c/c++)

WIN判斷網路是否連通(c/c++)

// 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 失敗。