Thread IO::Socket Server, der mehrere Clients simultan "bedient" (3 answers)
Opened by FoolAck at 2008-08-17 16:39

betterworld
 2008-08-17 20:45
#113621 #113621
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn die Verbindung zu einem Client beendet wird, kriegst Du das Handle noch einmal von select() geliefert, damit Du die Verbindung serverseitig vernuenftig vergessen kannst.

Das heißt, bei $data = <$sock>; solltest Du prüfen, ob $data defined ist. Wenn nicht, ist entweder ein Lesefehler aufgetreten ($! ist gesetzt) oder EOF erreicht ($! ist nicht gesetzt).

Du musst übrigens aufpassen denn <$sock> blockt, bis eine ganze Zeile da ist, das ist nicht so gut im Singlethread-Server. Also lieber syswrite und so'n Kram benutzen, das hat auch gleich einen vernünftigen Check auf EOF.

Ferner solltest Du auch die Ausgabe puffern... Zurzeit schickst Du ja nur an die Clients, an die Du was schicken kannst. Besser wäre es, für die restlichen Clients die Ausgabe zu puffern, bis sie in can_write sind. Jedenfalls für einen Chat wäre das besser.

Außerdem kann auch can_write blocken.

View full thread IO::Socket Server, der mehrere Clients simultan "bedient"