以下两种方法都通过超时连接的方式判断网络连接:
一:
DWORD flags;//上网方式
BOOL InternetState;
InternetState=InternetGetConnectedState(&flags,0);
if(!InternetState)网络未连接;
二:
#include <iphlpapi.h>
OVERLAPPED overLapped;
HANDLE handle=CreateEvent(NULL, false, false, NULL );
overLapped.hEvent=handle;
//创建一个子进程来等待消息
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
SIZE_T dwStackSize = 0;
//LPTHREAD_START_ROUTINE lpStartAddress;
LPVOID lpParameter = (LPVOID)&handle;
DWORD dwCreationFlags = 0 ;
DWORD lpThreadId;
HANDLE THandle=CreateThread(lpThreadAttributes, // SD
dwStackSize, // initial stack size
WaitForEvent, //lpStartAddress,thread function
lpParameter, // thread argument
dwCreationFlags, // creation option
&lpThreadId // thread identifier
);
//子线程:
DWORD WINAPI WaitForEvent(LPVOID data){
HANDLE handle;
DWORD dwError;
handle=*(HANDLE*)data;
while(1){
DWORD m_dwResult=NotifyAddrChange(NULL,&overLapped);
if (ERROR_IO_PENDING != m_dwResult)
{
AfxMessageBox("NotifyAddrChange() failed");
}
dwError=WaitForSingleObject(handle,500);
if( dwError == WAIT_OBJECT_0)
{
//A需要判断是否有新的网络设备启用
unsigned long OutBufLenN=0;
PIP_ADAPTER_INFO AdaptersInfo=NULL;
DWORD dret;
dret=GetAdaptersInfo(AdaptersInfo,&OutBufLenN);
if(dret!=ERROR_BUFFER_OVERFLOW)
{
return 0;
}
AdaptersInfo=(PIP_ADAPTER_INFO) HeapAlloc(GetProcessHeap(), 0, OutBufLenN);
dret=GetAdaptersInfo(AdaptersInfo,&OutBufLenN);
if(dret!=ERROR_SUCCESS)
{
HeapFree(GetProcessHeap(), 0, AdaptersInfo);
return 0;
}
if(AdaptersInfo->Type==MIB_IF_TYPE_ETHERNET)
{
CString str=AdaptersInfo->IpAddressList.IpAddress.String;
MIB_IFROW ifrow;
memset(&ifrow,0,sizeof(MIB_IFROW));
ifrow.dwIndex=AdaptersInfo->Index;
if(GetIfEntry(&ifrow)!=NO_ERROR)
return 0;
DWORD len=ifrow.dwMtu;
switch (ifrow.dwOperStatus)
{
case MIB_IF_OPER_STATUS_NON_OPERATIONAL:
//AfxMessageBox("网络断开。。。");
............
break;
case MIB_IF_OPER_STATUS_OPERATIONAL:
//AfxMessageBox("网络连接。。。");
............
break;
}
}
}
}