Woher wissen wir nun, wann wir online sind? Dazu stellt uns die Unit "WinInet.pas" die Funktion "InternetGetConnectedState" zur Verfügung. Diese Funktion besitzt nur zwei Parameter, von denen wir den ersten ignorieren können. Der zweite ist reserviert und interessiert daher auch nicht. Die Funktion liefert true zurück, wenn wir online sind:
Result := (InternetGetConnectedState(nil,0));
Das Beispielprogramm enthält aber noch eine erweiterte Funktionalität. Im Normalfall prüfen wir nur, ob überhaupt eine Internetverbindung besteht. (Wie gesagt: das Programm wählt sich ja nicht selbst ein!) Um uns später mit dem Time-Server verbinden zu können, benötigen wir dessen IP-Adresse. Dazu nutzen wir die Funktion "GetHostByName", die aber nur im Erfolgsfall (sprich: bei aktiver Web-Verbindung) aufgerufen wird. Beispielsweise:
hostent := gethostbyname('ntpserv.fh-magdeburg.de');
Die Funktion "GetHostByName" holt Informationen zu der angegebenen URL und gibt diese, als Funktionsergebnis, an eine Variable vom Typ PHostEnt weiter. Im Fall eines Fehlers bzw. wenn wir nicht (mehr) online sind, ist diese Variable nil.
All das passiert im Beispiel in einer eigenen Funktion, die Sie wie folgt aufrufen:
if(not IsOnline('ntpserv.fh-magdeburg.de',@dwIp)) or (dwIp = 0) then exit;
Falls Sie online sind und der benutzte Time-Server erreichbar war, enthält die Variable im zweiten Parameter ("dwIp" im Beispiel) die IP-Adresse des Servers.
Wenn Sie lediglich testen wollen, ob Sie online sind, genügt auch der Aufruf
if(not IsOnline(nil,nil)) then { ... }
der auch schneller ist, weil keine URL aufgelöst werden muss. Es ist ebenfalls möglich, nur eine URL anzugeben:
if(not IsOnline('www.microsoft.de',nil)) then { ... }
In diesem Fall wird das Funktionsergebnis (online oder nicht online) davon abhängig gemacht, dass a) eine aktive Web-Verbindung besteht und b) die benutzte URL erreichbar ist. Ist das nicht der Fall, dann wäre das Ergebnis false, obwohl Sie evtl. eine aktive Web-Verbindung haben und damit ja eigentlich online sind.
Die IP wird in beiden Fällen allerdings ignoriert, weil: nicht benutzt.
Die IP-Adresse wird in der so genannten "host byte order" zurückgegeben. Das ist für unsere Zwecke in Ordnung, aber wenn Sie die IP z.B. in Ihrem Programm anzeigen wollen, müssen Sie sie vorher "drehen". Warum? Nehmen wir als Beispiel den localhost. Würden Sie seine IP wie folgt bestimmen:
hostent := gethostbyname('localhost');
dwIp := integer(POINTER(hostent^.h_addr_list^)^);
dann wäre das Ergebnis "1.0.0.127" (formatiert als IP-Adresse). Nun sehen Sie selbst, dass dieser Wert einfach nur "verdreht" ist. Mit der Funktion "htonl" konvertieren Sie ihn in die "TCP/IP network byte order", so dass die erwartete Adresse "127.0.0.1" daraus wird.