Cum să determinați dacă un computer este conectat la Internet sau nu?
Recent, cu o permanență de invidiat, întrebarea "Cum să determinați dacă un computer este conectat la Internet sau nu?" Să ne gândim la acest subiect și să explicăm câteva dintre principiile interacțiunilor de rețea.
Mulți dintre dvs. au observat următoarea situație: pe un computer care rulează MS Windows este o carte de rețea. Să presupunem că driverul cardului nu este configurat corect sau dacă calculatorul nu este conectat fizic la rețea. La pornire, sistemul nu va afișa erori. Numai după ce încercați, de exemplu, să intrați în Network Neighborhood, va apărea un mesaj care indică faptul că rețeaua nu este disponibilă.
De aici:- În primul rând, din punct de vedere al sistemului (ceea ce înseamnă partea din program), este imposibil să se determine dacă transmiterea datelor este posibilă în prezent (adică dacă există o "conexiune la rețea" notorie) fără transmisia însăși;
- în al doilea rând, pornind de la cele de mai sus, întrebarea ar trebui adusă în minte: "Există vreun serviciu nod sau serviciu de rețea disponibil?" (adică este posibil să transmiteți date efectiv?)
În primul rând, vom respinge convingerile celor care cred că următoarele metode și funcții pot fi folosite pentru a răspunde la această întrebare:
Pentru a vă asigura că această funcție este inutilă pentru scopurile noastre, este suficient să vă uitați la descrierea sa în MSDN:
„Nu se poate baza numai pe faptul că InternetGetConnectedState returnare adevărat că aveți o conexiune validă la Internet activă. Este imposibil ca InternetGetConnectedState pentru a determina dacă întreaga conexiune la Internet funcționează fără a trimite o cerere către un server. Acesta este tine de ce trebuie să trimită o cerere pentru a determina dacă sunteți într-adevăr conectat sau nu. puteţi fi siguri că dacă totuși InternetGetConnectedState returnează TRUE, care încearcă conexiunea nu va determina să vi se solicite să se conecteze la furnizorul prestabilit de servicii Internet. "
„Nu se poate baza numai pe faptul că, în cazul f-TION InternetGetConnectedState returnează TRUE, aceasta înseamnă că există o conexiune activă la Internet. InternetGetConnectedState nu se poate determina dacă o conexiune la Internet funcționează fără referire la server.“
Singurul lucru util în această funcție este că, dacă s-a întors TRUE, atunci când încercați să vă conectați la Internet, nu vi se va oferi mai întâi conectarea la acesta.
Funcția GetHostByName () - rezoluția numelor gazdă.
Rezultatul returnat de această funcție, mărturisind - conform MSDN - despre finalizarea cu succes a acesteia, spune doar că serviciul DNS este configurat corect și disponibil în sistem. De obicei, serverele DNS sunt localizate fie în rețeaua locală a furnizorului, fie în rețeaua locală la care este conectat computerul nostru (de exemplu, rețeaua de organizare). Deși, fără îndoială, serverele de nume fac parte din ceea ce este astăzi Internetul, în oricare dintre cazuri soluția reușită a numelui gazdei ne va spune doar despre disponibilitatea serverului DNS și nimic mai mult.
Determinarea activității unei conexiuni dialup cu un anumit furnizor.
Cel mai important lucru în acest caz este faptul că un dial-up, în general, nu este conectat la Internet. Este doar un instrument pentru a conecta sistemele noastre de hardware și software pentru sisteme software și hardware de la distanță, dar nu la rețea. Cu alte cuvinte - descoperirea unora dintre dialup-compus activ în prezent, arată doar că între două la distanță punct de vedere geografic de la fiecare alte calculatoare de comunicații instalate folosind low-level protocoale de conexiune mezhmodemnoy și unul dintre remoting protocoale logice (PPP, SLIP, și altele) . Acesta este - doar una dintre posibilele căi de comunicare între cele două computere care pot fi folosite pentru orice scop, inclusiv pentru a comunica cu gazdele Internet.
Și acum - adevărul!
Din punctul de vedere al protocolului TCP / IP, puteți merge numai în două moduri corecte pentru a rezolva sarcina:- Utilizați protocolul ICMP: ping, traceroute; (răspunde la întrebarea despre disponibilitatea unui nod, dar nu indică disponibilitatea unui anumit serviciu pe acest nod). Funcțiile cheie sunt IcmpSendEcho () (implementat în ICMP.DLL), InternetCheckConnection () (implementat în WININET.DLL)
- Încercați să vă conectați la un site Internet. fie la noi sau necesare pentru cel mai probabil, care rulează în acest moment (motoarele de căutare, site-uri de companii mari, etc.), definind o reacție de program la erori în funcțiile de conectare apel (modul cel mai de încredere și de încredere pentru a verifica modul în care disponibilitatea componentelor și a serviciilor) . Funcția cheie este Connect () (implementată în WS2_32.DLL)
Un exemplu de ICMP care utilizează API-ul ICMP (prima cale) este descris în articolul corespunzător.
Pentru a implementa calea 2-a, sunt potrivite componentele gata făcute de la Delphi Internet standard, FastNet (TClientSocket, TPowerSock) și multe componente din pachetul Indy. Puteți face același lucru și puteți implementa propriul algoritm utilizând apelurile API Winsock direct.
Ca un scurt rezumat al tuturor celor de mai sus, putem spune următoarele.
Internetul, prin definiție, este o rețea globală, o rețea de rețele locale. „Conexiune“ la Internet, din acest punct de vedere, există doar un potențial (care nu este garantat) abilitatea de a „comunica“ computer (gazda), un computer din rețea (nod) la un alt set de rețea pentru acorduri Internet-service cu furnizarea de o astfel de posibilitate on-line - furnizorii ambelor părți. Și dacă o astfel de caracteristică este realizabilă în momentul de interes (țintă de calculator / nod „corespunde“ încercări de conectare „și sau ping“ a), se poate afirma cu o anumită probabilitate ca „computer conectat la Internet.“