Mailinglisten-Archive |
Hi! Ich bin fast am verzweifeln, vielleicht kann mir ja hier jemand helfen... Also, ich möchte einen HL-Server abfragen (Statistiken eben). Also verbinde ich zu Port 27015 des jeweiligen Rechners mit: $fp = fsockopen("udp://$ip", $port, &$errno, &$errstr, 5); Danach überprüfe ich, ob die Verbindung geklappt hat: if ($fp) return $fp; else exit; Das ganz große Problem dabei: Es funktioniert nicht, wenn der Rechner nicht erreichbar ist. Wenn der Rechner erreichbar ist und der HL-Server läuft, kein Problem. Aber wenn entweder der HL-Server oder der Rechner nicht läuft, bekomme ich trotzdem einen $fp zurück, also if($fp) wird immer ausgeführt, auch wenn die Verbindung gar nicht zustande gekommen ist! Und hier fangen die ganzen Probleme an: Ich lese mit fread($fp, 4) die ersten Daten aus. Allerdings kann ich nun nicht bestimmen, ob da tatsächlich Daten ankommen können (sprich, ob die Verbindung besteht) oder nicht. D.h, wenn der Server antwortet, ist alles ok, aber wenn der Server nicht antwortet, dann hängt das Skript an genau dieser Stelle (hab ich mit syslog() ausgetestet), weil es ewig (wirklich ewig - alle Timeouts werden ignoriert) auf die Anzahl Daten wartet, die ich im 2. Parameter angegeben hab (in dem Fall 4 Bytes). Man kann zwar dieses Warten mit socket_set_blocking ($fp, false) aufheben, aber dann kann es sein, dass ich bei antwortendem Server nicht alle Daten kriege, weil er bereits vorher aufhört zu lesen. Also, um es nochmal auf den Punkt zu bringen: Wie kriege ich raus, ob eine Verbindung per fsockopen() wirklich besteht? Achja, socket_get_status() liefert auch nicht die gewünschten Ergebnisse... Sebastian "TheTinySteini" Steinlechner
php::bar PHP Wiki - Listenarchive