Título: Detectando conexão com a Internet
Linguagem: C/C++
S.O.: Windows
Autor(es): Wenderson Teixeira
Alguns programas, que verificam e-mail ou fazem downloads automáticos, só
realizam estas tarefas, quando você se conecta a Internet, eu fiquei me
perguntando, mas como eles fazem, já que quando eu tento verificar e-mail
ou outra coisa que exija uma conexão, o diálogo de conexão da Rede Dial-Up é
iniciado, pois bem, vasculhando o Help, achei uma uma rotina da API que
resolve este problema, esta rotina é RasEnumConections
,
o único problema é que sua utilização não é muito simples, principalmente
se existir mais de uma conexão ativa, existe uma forma de simplificar esta
tarefa, eu desenvolvi uma rotina que já verifica quantas conexões estão
ativas, aloca memória para elas e já faz a sua enumeração, vale observar
que a memória deve ser desalocada pelo processo, utilizando GlobalFree
,
segue abaixo uma descrição a função RasEnumConnections e seus parâmetros e
o código fonte da função EnumConnections
.
DWORD RasEnumConnections( LPRASCONN lprasconn, // buffer que receberá uma lista com os dados das conexões ativas LPDWORD lpcb, // tamanho do buffer em bytes LPDWORD lpcConnections // número de conexões escritas no buffer );Parameters
EnumConnections
e um programa de teste demonstrando-se como utilizá-la, este deve ser compilado para "Win32 / Console", mas a função pode ser usada tanto em modo Console como GUI.#include <windows.h> #include <ras.h> #include <stdio.h> #include <conio.h> #ifndef __cplusplus typedef enum { false, true } bool; #endif #define ESC 27 //--------------------------------------------------------------------------- int __fastcall EnumConnections(LPRASCONN *lppRasConn) { LPRASCONN lpRasConn; DWORD cb = 0, cConnections = 0; // Verifica quantas conexões estão ativas RasEnumConnections(0, &cb, &cConnections); if(cConnections) { // Aloca memória p/ as conexões lpRasConn = (LPRASCONN)GlobalAlloc(GPTR, sizeof(RASCONN) * cConnections); // Se falhar retorna -1 if(!lpRasConn) return -1; // Pega as propriedades das conexões lpRasConn[0].dwSize = sizeof(RASCONN); cb = sizeof(RASCONN) * cConnections; if(RasEnumConnections(lpRasConn, &cb, &cConnections)) { // Se falhar, libera memória e retorna -1 GlobalFree(lpRasConn); return -1; } // Atribue o buffer ao ponteiro passado como parâmetro, // nunca se esquecer de liberar a memória quando o buffer // não for mais utilizado. *lppRasConn = lpRasConn; } // Retorna o número de conexões return cConnections; } //--------------------------------------------------------------------------- void main() { LPRASCONN lpRasConn; int cConnections; char key = 0; int oldCount = -2; while(key != ESC) { cConnections = EnumConnections(&lpRasConn); if(kbhit()) key = getch(); if(oldCount != cConnections) { oldCount = cConnections; clrscr(); switch(cConnections) { case -1: printf("Erro verificando conexões."); return; case 0: printf("Nenhuma conexão ativa."); break; default: for(int c = 0; c < cConnections; c++) { RASCONNSTATUS RasConnStatus; RasConnStatus.dwSize = sizeof(RASCONNSTATUS); RasGetConnectStatus(lpRasConn[c].hrasconn, &RasConnStatus); printf("%s - %s - %s\n", lpRasConn[c].szEntryName, lpRasConn[c].szDeviceName, RasConnStatus.rasconnstate == RASCS_Connected ? "Conectado" : "Não conectado"); } } GlobalFree(lpRasConn); } } }