eddi: Timeout in ICQ?

Beitrag lesen

Hallo,

Schmeißt ICQ einen nach einer bestimmten Zeit raus, sodass ich mich neu einloggen muss?

vermutlich; aber am Protokoll wurde in letzter Zeit Modifizierungen vergenommen.

Kann ich irgendwie feststellen, dass ich in ICQ rausgeflogen bin (im PHP Script)?

Das ist nur durch einen kleinen Trick mit if([link:http://de3.php.net/manual/de/function.stream-socket-get-name.php@title=stream_socket_get_name]($stream,TRUE)!==FALSE){} möglich. fwrite(), feof() und der Gleichen melden leider nicht, wenn die Verbindung zusammenbricht ;(

Nun kommt es darauf an, wie Du Dein Script aufgebaut hast. Wenn es in einer while(1)-Schleife mit fgets() auf eigehende Daten an einer blockierten Verbindung wartet, kannst Du natürlich nicht feststellen, ob derweil die Verbindung bereits geschlossen wurde. Das Script wird bis zum konfigurierten/programmierten timeout beflissen warten und warten und warten und... Daher arbeite ich mit kürzeren timeouts, die die Verbindung clientseitig schließen. Das hat so seinen Grund. Allerdings hilft Dir das in Deinem Fall nicht weiter, da Du ja so lange, wie Du nicht gekickt wirst, bemüht bist die Verbindung zu halten.

Also würde ich an Deiner Stelle die Verbindung öffnen und sie mit stream_set_blocking() entblocken. Das wirklich ärgerliche dabei ist, daß hierbei verschiedene Nebeneffekte zu beobachten sind. So mußt Du in der while-Schleife, deren Anweisungsblock für das Auslesen der Daten aus der Verbindung verantwortlich ist, mit usleep() selbst dafür sorgetragen, daß Dir der Prozess nicht alle Systemresourcen auffrist. Sind dann wirklich Daten da, kann es Dir passieren, daß Du mit einem fgets() nicht alle Daten einer ICQ-Message mit einmal bekommst, denn die Verbingung ist ja nicht blockiert. Soweit nur zu den Gründen, warum ich darauf so erpicht bin, nach Möglichkeit Verbindungen clientseitig mit einem timeout zu versehen ;)

(BTW.: Die Funktion stream_get_meta_data(), bei der man ja vermuten dürfte, daß man z. B. den Verbindungsstatus, aber auch unter "unread_bytes" die empfangene Datengröße ablesen kann, ist totaler Schrott!)

Ich hatte Dir oben ja geschrieben, daß timeouts ja auch clientseitig gesetzt werden können. Möglicher Weise ist genau _das_ Dein eigentliches Problem. Mit oben beschreibenem Steuerfluß einer nicht blockierten Verbindung kannst Du innerhalb Deiner while-Schleife eine Routine einbauen, die mit stream_set_timeout() in einem Interval dafür sorgt, daß das timeout regelmäßig aufgefrischt wird.

Gruß aus Berlin!
eddi