2013-04-03 13 views
10

Come posso controllare a livello di codice se la mia macchina ha accesso a Internet o non usare C/C++, è solo questione di eseguire il ping di un IP? Come fa NIC a farlo? Voglio dire qualcosa come:Controllare a livello di codice se la mia macchina ha accesso a Internet o no

enter image description here

Sto usando Windows 7.

+0

Windows 7 dispone già di un servizio che esegue questa operazione. È come funziona l'icona della barra delle applicazioni per farti sapere che la rete ha la connettività Internet. –

+0

@EricUrban Sembra che Windows esegua una combinazione di ricerca DNS oltre a richiedere un documento da un IP specifico. Vedi [Conoscenza della rete di Windows 7] (http://blog.superuser.com/2011/05/16/windows-7-network-awareness/). –

+0

@WesleyBaugh Che è accurato. –

risposta

11

Se si lavora su Windows, basta provare questo

#include <iostream> 
#include <windows.h> 
#include <wininet.h> 
using namespace std; 

int main(){ 

if(InternetCheckConnection(L"http://www.google.com",FLAG_ICC_FORCE_CONNECTION,0)) 
{ 
     cout << "connected to internet"; 
} 

return 0; 
} 
+1

Cosa succede se l'utente è connesso a Internet ma non può accedere a Google, come uno dei miliardi di persone in [un paese abbastanza grande] (https://en.wikipedia.org/wiki/Google_China#Ending_of_self-censorship)? –

4

Non c'è niente del genere penso, ma si può provare questo:

Il modo più semplice è quello di cercare di connettersi a un indirizzo IP esterno noto.

Se fallisce in Windows, la funzione Connect tornerà SOCKET_ERROR e WSAGetLastError di solito tornare WSAEHOSTUNREACH (cioè il pacchetto non può essere inviato per l'host).

In Linux, verrà restituito uno -1 e errno sarà ENETUNREACH. Alcuni link utili:

1. Link for Windows Sockets

2. Link for Linux/Unix sockets

+2

Come suggerimento, proverei a connetterti a una manciata di server DNS "famosi" che possono prendere il carico, come '8.8.8.8' (server DNS pubblico di google). Fai più di uno da più di una compagnia, in modo da poter rilevare un parziale errore di rete (come google che va giù) e consentire all'utente di "forzare l'accesso a Internet" anche se pensi che sia inattivo (cioè, non disabilitare roba solo perché il tuo euristico sta avendo problemi). Ricorda inoltre di risparmiare in quanto ti connetti, controllare ogni secondo è scortese. Per i test interni, utilizza i tuoi indirizzi IP di proprietà, quindi quando fai lo svanitore e lo spam, puoi sistemarlo. – Yakk

+1

Ancora meglio: in genere è necessario l'accesso a Internet per accedere al proprio server. Prova prima. Solo se ciò fallisce (raramente) dovresti provare a eseguire il ping su "8.8.8.8', in modo da poter dire all'utente se è il tuo server o la connessione Internet che non funziona. – MSalters

0

Il seguente codice funzionerà, se siete su Windows:

#include <iostream> 
#include <windows.h> 

int main(){ 

    if (system("ping www.google.com")){ 
      std::cout<<"\nNot connnected to the internet\n\n"; 
    } 
    else{ 
      std::cout<<"\nConnected to the internet\n\n"; 

    } 
    system("pause"); 
    return 0; 
} 
1

Là è in realtà un modo molto intelligente incluso il codice snip here.

In pratica si utilizza l'opzione cmd: Mentre è in CMD: route print.

Questo mapperà la tabella di routing con un array e cercherà 0.0.0.0 come connessione Internet disponibile.

ho utilizzato con un while(true){//the code in here } //check for inet connection , else will sleep for 10 mins and check again