Thread IO::Socket Server, der mehrere Clients simultan "bedient"
(3 answers)
Opened by FoolAck at 2008-08-17 16:39
Joar. Also inzwischen bin ich soweit:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 use strict; use warnings; use IO::Socket; use IO::Select; my $server = IO::Socket::INET->new( Proto => 'tcp', LocalPort => shift || 1234, Listen => 5, Timeout => 3 * 60, Reuse => 1, ); die "server\n$!\n" if not defined $server; my $selector = IO::Select->new($server); my $data; my $curr; while (1) { for my $sock ($selector->can_read()) { if ($sock == $server) { my $client = $server->accept(); $selector->add($client); $data = "New client (ip: ".$client->peerhost().") joined\n"; $curr = 0; } else { $data = <$sock>; $curr = $sock; } for my $sock ($selector->can_write()) { next if (($sock == $server) || ($sock == $curr)); print $sock $data; } } } Funktioniert eigentlich auch schon, aber ich bekomme ab und zu puren warnings-Spam mit der Warnung "Use of uninitialized value in print at sv_test.pl line 38, <GEN1> line 1.". (Hab noch nicht herausgefunden, bei was genau das passiert. Das "GEN1" wird auch manchmal zu "GEN2" bis zu "GEN4" (wahrscheinlich je nachdem wie viele clients connected sind).) Also natürlich in Bezug auf die "print $sock $data" Zeile. Aber eigentlich sollte $data doch immer einen Wert haben, oder? //Edit: k, die "uninitialized value" Warnungen kamen daher, dass ich die netcat sessions einfach per ctrl+c beendet habe und dadurch die Handles nicht ordnungsgemäß geschlossen wurden. |