电脑端用于检测网络状态,不存在系统推送窗口消息,需要进行主动获取,可以实现的方法:
1. BOOL InternetCheckConnection( __in LPCTSTRlpszUrl,__in DWORD dwFlags,__in DWORD dwReserved);
BOOL bConnected = InternetCheckConnection(_T("http://www.baidu.com"), FLAG_ICC_FORCE_CONNECTION, 0);
当返回结果为TRUE,代表为连接状态;当返回结果为FALSE,代表链接已断开。
2. 可以通过向某个特定主机创建socket的方式进行
BOOL bConnectInternet = FALSE;
DWORD WINAPI ThreadTestInternet(IN LPVOID lp)
{
bConnectInternet = FALSE;
SOCKADDR_IN m_sockaddr;
SOCKET m_hSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if( m_hSocket == INVALID_SOCKET )
return FALSE;
if( g_strTotalDptServer.empty() ) {<span style="white-space:pre"> </span>//这里的<span style="font-family: Consolas, 'Courier New', Courier, mono, serif;">g_strTotalDptServer表示ip地址</span>
m_sockaddr.sin_addr.s_addr = INADDR_ANY;
}
else {
USES_CONVERSION;
LPCSTR pstrAddress = T2CA(g_strTotalDptServer.c_str());
m_sockaddr.sin_addr.s_addr = ::inet_addr(pstrAddress);
if( m_sockaddr.sin_addr.s_addr == INADDR_NONE ) {
PHOSTENT pHost = ::gethostbyname(pstrAddress);
if( pHost == NULL ) return FALSE;
::CopyMemory(&m_sockaddr.sin_addr, pHost->h_addr_list[0], pHost->h_length);
}
}
m_sockaddr.sin_family = AF_INET;
m_sockaddr.sin_port = ::htons(8222);
if( ::connect(m_hSocket, (PSOCKADDR) &m_sockaddr, sizeof(m_sockaddr)) == SOCKET_ERROR )
{
::closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
return FALSE;
}
if( m_hSocket == INVALID_SOCKET )
return FALSE;
::shutdown(m_hSocket, SD_BOTH);
::closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
bConnectInternet = TRUE;
return TRUE;
}
BOOL ClientTestInternet()
{
//此处用于检测网络,由于当网线被拔掉以后,connect会被卡住,故采用线程以及设置超时的方法及时进行判断
HANDLE hreadThread = CreateThread(NULL, 0, ThreadTestInternet, NULL, 0, NULL);
DWORD dwResult = WaitForSingleObject(hreadThread, 8000); //设置超时时间 8s
if(dwResult == WAIT_TIMEOUT)
{
TerminateThread(hreadThread, 0);
DebugInfoA("检测网络连接超时");
bConnectInternet = FALSE;
}
return bConnectInternet;
}
通过直接调用ClientTestInternet方法就可以获取当前网络状态