Thread Script beenden ?
(31 answers)
Opened by BrownWolf at 2003-12-18 04:42
Ich mach's auch immer mit Select und die Identifizierung des Clients läuft bei mir dann so:
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 my %socket; # für die Registrierung der Socketverbindungen # Socketschleife my $exit_flag; until($exit_flag) { # warten, auf Verbindung oder Daten (Timeout, daß nichtblockierend) if (my @ready = $select->can_read(1)) { # für alle Sockets, die bereit sind loop: foreach my $socket (@ready) { # wenn Listener, dann neue Verbindung akzeptieren if ($socket == $listen) { my $new = $listen->accept; # neuen Socket zum Select-Objekt hinzufügen $select->add($new); # Verbindungsinformationen einsammeln my ($port, $ip) = sockaddr_in getpeername $new; $ip = inet_ntoa $ip; # Socket registrieren und Puffer für Verbindung bereitstellen $socket{$new} = { handle => $new, ip => $ip, port => $port, inbuf => '', outbuf => '', }; print_dos qq~Client "$socket{$new}->{ip}" verbunden. ~; # Dauerfehlerlog verhindern unless (continue_socket $new) { print_dos qq~Client "$socket{$new}->{ip}" durch Server abgewiesen. ~; destroy_socket $new, nolog => 1; } } elsif (exists $socket{$socket}) { # sonst Daten lesen for (my $buf) { $socket->recv($_, 512); length $_ and continue_socket($socket) or do { # nichts gelesen, Verbindung verloren # oder # Dauerfehlerlog verhindern # Socket beenden, wenn neue Daten von ihm kommen und # bei der letzten Transaktion ein Fehler aufgetreten ist destroy_socket $socket, nolog => 1, by_client => 1; next loop; }; # gelesene Daten an Puffer hängen $socket{$socket}->{inbuf} = "$socket{$socket}->{inbuf}$_"; # Daten anzeigen print_dos "<<<@{[ctrl2hex $_]}<<< " if PRINT_DATA; } # Daten verarbeiten data_proc $socket; } } } if (my @ready = $select->can_write(0)) { # für alle Sockets, die bereit sind loop: foreach my $socket (@ready) { # Socket ist bekannt und hat Daten zum Senden if (exists $socket{$socket} and length $socket{$socket}->{outbuf}) { $socket->send($socket{$socket}->{outbuf}) or do { # konnte nichts senden, Verbindung verloren destroy_socket $socket, nolog => 1, by_client => 1; next loop; }; # Daten anzeigen print_dos ">>>@{[ctrl2hex $socket{$socket}->{outbuf}]}>>> " if PRINT_DATA; # gesendete Daten löschen $socket{$socket}->{outbuf} = ''; } } } } if ($exit_flag) { # alle Verbindungen beenden destroy_socket $socket{$_}->{handle}, nolog => 1 for keys %socket; } exit(0); <!--EDIT|steffenw|1072552157--> $SIG{USER} = sub {love 'Perl' or die};
|