Thread Sockets: Zwei Clients verbinden (41 answers)
Opened by esskar at 2005-04-14 14:24

Froschpopo
 2005-05-11 11:51
#37762 #37762
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=renee,18.04.2005, 10:05]Ein bißchen mehr ausprobieren würde Dir häufig zum Ziel helfen...


Code: (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
#! /usr/bin/perl

use strict;
use warnings;
use IO::Socket::INET;
use IO::Select;
use Data::Dumper;

# Listensocket erstellen
my $server = IO::Socket::INET->new(
   LocalPort => 2005,
   type => SOCK_STREAM,
   Reuse => 1,
   Listen => 10
) or die "Server läuft nicht: $@\n";


my $select = IO::Select->new($server);
my %hash;

# warten, bis ein client sich anmeldet, oder
# man von bereits angemeldeten clients lesen kann
my $answer = 0;
while(my @readable = $select->can_read) {
  foreach my $socket (@readable) {
     if($socket == $server) { # wenn der socket gleich dem listensocket ist
        # Create a new socket
        print "New client connects\n";
        my $client = $socket->accept; # kehrt direkt zurück
        $select->add($client); # in select object aufnehmen
        my $name = $client->getline; # von socket lesen
        if(defined $name) { # kein Fehler?
           $name =~ s!\r?\n$!!g; # Zeilenumbruch entfernen
           my ($rname) = $name =~ /^name: ([^\s]+)$/;
           print "rname: ",$rname,"\n";
           $hash{$_}->print($rname." has connected\n") for(keys(%hash));
           $hash{$rname} = $client;
        } else {
          next;
        }
     } else { # sonst
        my $line = $socket->getline; # von socket lesen
        if(defined $line) { # kein Fehler?
           $line =~ s!\r?\n$!!g; # Zeilenumbruch entfernen
           if(lc($line) eq "quit") { # falls der Client beenden will
              print "Client quits\n";
              delete_socket($select, $socket);
           }
           elsif($line =~ /^msg\s([^\s]+)\s*(.*)$/){
             my %reverse = reverse %hash;
             print "name: ",$1,"\n";
             my $socket_tmp = $hash{$1};
             if($1 eq 'all'){
               $hash{$_}->print($reverse{$socket}.': '.$2."\n") for(keys(%hash));
               next;
             }
             $socket_tmp->print($reverse{$socket}.': '.$2."\n");
           }
           else { # ansonsten, message ausgeben
              print "Client says: [$line]\n";
           }
        } else {
          print "Connection closed by client\n";
          delete_socket($select, $socket);
        }
     }
  }
}
[/quote]
funktioniert soweit bestens. Aber bei größerer Datenmenge kommts dann schon zu verzögerungen. Deshalb würd ich gerne forken.
Ich hab bisher fork nur in einfachen scripten angewandt, aber wie empfielt es sich bei Sockets? Wann soll ich forken? Welchen Teil lagert man am besten in den Kindprozess aus, welchen nicht ?

View full thread Sockets: Zwei Clients verbinden