Compartilhar via


Determining if a Network Connection is Present

Windows Mobile SupportedWindows Embedded CE Supported

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

  1. Chamar WSAStartup Para inicializar sockets do Windows (Winsock).

  2. Chamar gethostname Para obter o nome do local hospedar.

  3. Chamar getaddrinfo Para resolver o nome do local hospedar para todas as famílias protocolo para obter uma lista de endereços rede.

  4. 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.

  5. Chamar freeaddrinfo Para informações de endereço alocadas pelo livre getaddrinfo.

  6. 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

Other Resources

Winsock Application Development