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 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 arată că rețeaua nu este disponibilă.
Î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 în sine;
î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?)
Răspunsul la acesta și ocupați-vă.
Î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, indicând - în conformitate cu MSDN - finalizarea cu succes a acestuia, spune doar că sistemul este configurat în mod corespunzător și servicii DNS disponibile. 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, desigur, serverul de nume și fac parte din ceea ce este astăzi un web, și în acest lucru și într-un alt caz, rezolvarea cu succes a numelui de gazdă ne va spune doar despre DNS-server este disponibil și nu mai mult.
Determinarea activității unei conexiuni dialup cu un anumit furnizor.
Principalul lucru în acest caz este că dialup-ul, în general, nu are nimic de a face cu Internetul. Acesta este doar un mijloc de a conecta sistemul software și hardware la sistemele software și hardware la distanță, dar nu la rețele. 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 doar î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 utilizând API-ul ICMP (prima cale) este descris în articolul corespunzător.
Pentru punerea în aplicare a 2-a căii ar trebui să fie fine componente gata făcute din paletele standard de Delphi Internet, FASTNET (TClientSocket, TPowerSock), precum și multe dintre componentele 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 (computer țintă / nod „corespunde“ sau încercări connect'a ping'a), putem afirma cu o anumită probabilitate ca „computer conectat la Internet.“