Determining if a Network Connection is Present
9/8/2008
Usando sockets do Windows (Winsock), você pode determinar programaticamente Se o local dispositivo está conectado a uma rede.
Para determinar se uma rede está presente
Chamar WSAStartup Para inicializar sockets do Windows (Winsock).
Chamar gethostname Para obter o nome do local hospedar.
Chamar getaddrinfo Para resolver o nome do local hospedar para todas as famílias protocolo para obter uma lista de endereços rede.
Pesquisar a lista de endereços rede para verificar se ele contiver endereço de auto-retorno. Para redes IPv6, você deve também verificar se a lista contém o endereço IPv6 auto-retorno. Se qualquer um dos endereços corresponder ao endereço de auto-retorno, nenhuma conexão de rede está presente.
Chamar freeaddrinfo Para informações de endereço alocadas pelo livre getaddrinfo.
Chamar WSACleanup a livre quaisquer recursos para o aplicativo.
O seguinte amostra de código mostra como determinar se uma conexão rede está presente.
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
struct in_addr BIN_IPV4_ADDR_LOOPBACK = {127, 0, 0, 1};
struct in6_addr BIN_IPV6_ADDR_LOOPBACK = { 0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x1 };
#define MAX_LOCAL_NAME_LEN 64
//Function Prototypes
BOOL IsNetPresent();
void Print(TCHAR *pFormat, ...);
int _tmain (int argc, TCHAR* argv[])
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2), &WSAData);
Print(TEXT("Network Connection %s present"), IsNetPresent() ? (TEXT("IS")) : (TEXT("is NOT")) );
WSACleanup();
return 0;
}
//
// Determine if you have a IPv4 or IPv6 network address.
//
BOOL IsNetPresent()
{
BOOL bFoundLocalAddr = FALSE;
char szAddrASCII[MAX_LOCAL_NAME_LEN];
ADDRINFO AddrHints, *pAI, *pAddrInfo;
//
// Get the local host's name in ASCII text.
//
if(gethostname(szAddrASCII, MAX_LOCAL_NAME_LEN - 1))
{
Print(TEXT("Error getting local host name, error = %d"), WSAGetLastError());
return FALSE;
}
//
// To obtain a list of all the local
// addresses, resolve the local name with getaddrinfo for all
// protocol families.
//
memset(&AddrHints, 0, sizeof(AddrHints));
AddrHints.ai_family = PF_UNSPEC;
AddrHints.ai_flags = AI_PASSIVE;
if(getaddrinfo(szAddrASCII, "10", &AddrHints, &pAddrInfo))
{
Print(TEXT("getaddrinfo(%hs) error %d"), szAddrASCII, WSAGetLastError());
return FALSE;
}
//
// Search the addresses returned.
// If any of them match the loopback address, then
// are not connected to an outside network.
//
// Note: This will not tell you how many networks you
// are connected to. If one or more networks are present,
// then the loopback addresses will not be included in the
// list returned from getaddrinfo.
//
bFoundLocalAddr = TRUE;
for(pAI = pAddrInfo; pAI != NULL && bFoundLocalAddr; pAI = pAI->ai_next)
{
if(pAI->ai_family == PF_INET)
{
if(memcmp(&(((SOCKADDR_IN *)(pAI->ai_addr))->sin_addr), &BIN_IPV4_ADDR_LOOPBACK, sizeof(BIN_IPV4_ADDR_LOOPBACK)) == 0)
bFoundLocalAddr = FALSE;
}
else if(pAI->ai_family == PF_INET6)
{
if(memcmp(&(((SOCKADDR_IN6 *)(pAI->ai_addr))->sin6_addr), &BIN_IPV6_ADDR_LOOPBACK, sizeof(BIN_IPV6_ADDR_LOOPBACK)) == 0)
bFoundLocalAddr = FALSE;
}
}
freeaddrinfo(pAddrInfo);
return bFoundLocalAddr;
}
void
Print(
TCHAR *pFormat,
...)
{
va_list ArgList;
TCHAR Buffer[256];
va_start (ArgList, pFormat);
(void)StringCchPrintf(Buffer, 256, pFormat, ArgList);
#ifndef UNDER_CE
_putts(Buffer);
#else
OutputDebugString(Buffer);
#endif
va_end(ArgList);
}
See Also
Reference
WSAStartup
gethostname
getaddrinfo
WSACleanup
freeaddrinfo
Concepts
Using WSAStartup to Initialize Winsock