Thread "HASH"-Socket lesen (12 answers)
Opened by Oliver at 2019-05-27 22:11

Muffi
 2019-05-31 08:51
#190067 #190067
User since
2012-07-18
1465 Artikel
BenutzerIn
[default_avatar]
Socketkommunikation mach ich eigentlich (wenns mehr als nur ein Socket gleichzeitig ist) immer nach dem Schema:

CPAN:IO::Select (Abschnitt Example)

[EDIT] Und ich meine mich zu erinnern die Zeile 11 in eine while-Schleife umschreiben zu können. while (defined(my $new = $lsn->accept)).

Das hab ich schon in Chats mit tausend Leuten eingesetzt und das läuft stabil.
Dem can_read kannst du auch noch nen Timeout mitgeben, wenn du in der Schleife nicht stehen bleiben willst.
Dann Daten einlesen mit while { recv }, die Daten so lange auf ne Variable (z.B. $sock_data{$socket}) schreiben bis nichts mehr kommt und dann schaun, ob das vollständig ist. Wenn nicht, nichts tun und warten, ob in der nächsten Runde can_read noch was kommt.

Ich glaube mich zu erinnern, dass recv -1 zurückliefert bei Fehlern. Ich glaub auch, wenn der Client sich verabschiedet hat.
D.h. für den Anfang würd es reichen bei -1 den Socket rauszuwerfen.

Wie gesagt, das läuft recht gut, stabil und skaliert auch einigermaßen. Zumindest bis ein paar tausend Sockets. Danach braucht der can_read mit jedem Socket exponentiell mehr Zeit. Da sollt man dann auf was andres umsteigen.

Vielleicht ist das am Anfang ein bisserl Aufwand die Schleife zu baun, aber die kannst du dann für jedes Socketprojekt nehmen und kopieren.
Last edited: 2019-05-31 09:18:19 +0200 (CEST)
1 + 1 = 10

View full thread "HASH"-Socket lesen