Schrift
[thread]4452[/thread]

Server, auf mehrere Clients schreiben

Leser: 1


<< >> 6 Einträge, 1 Seite
.mike.
 2007-02-11 21:41
#37451 #37451
User since
2006-04-07
26 Artikel
BenutzerIn
[default_avatar]
hallo

hab einen kleinen server gebastelt mit IO::Socket.
ich kann mich auch mit mehrern Clients gleichzeitig zu diesem Server verbinden, hab das über fork() gelöst.
hab jetzt aber folgendes Problem:
ich würde gerne von einem Client, der an den Server angemeldet ist, eine Nachricht an den anderen Client (soll alles über den Server laufen) schicken, dh. die nachricht geht an den Server und der schickt Sie dann an den anderen Client weiter.

Wie mach ich sowas, denn die unterschiedlichen Clients werden ja von den Kindprozessen "verwaltet" ?
Müsste dann ein Kindprozess auf einen anderen zugreifen?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
while (my $client = $server->accept()) {
   if (fork() == 0) { # child (Kindprozesse kümmern sich um die einzelnen Clients)
       $client->autoflush(1);
       print $client "Welcome to $0. Please log in.\n";
       while (<$client>) {
           if (...) {} # prüfen was der client schickt...
           elsif (/quit|exit/i) { close $client; last; }
       }
   } # end if fork() == 0
}


danke für jede hilfe !
.mike.
betterworld
 2007-02-12 14:11
#37452 #37452
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Mit fork() laesst sich so etwas schwer realisieren.  Aber mehrere Clients kannst Du auch mit CPAN:IO::Select verwalten, dann brauchst Du nur einen einzigen Prozess.

Wenn Du aber mit fork() arbeiten willst, solltest Du ueberpruefen, dass der Rueckgabewert nicht undef ist, denn dann lag ein Fehler vor.  [s]Und ausserdem musst Du im Elternprozess auch ein close machen, denn die Filehandles im Elternprozess gehen nicht davon weg, dass Du sie im Kindprozess schliesst.[/s] Update: Das passiert ja automatisch durch den Destruktor, sorry\n\n

<!--EDIT|betterworld|1171282404-->
.mike.
 2007-02-12 16:16
#37453 #37453
User since
2006-04-07
26 Artikel
BenutzerIn
[default_avatar]
DANKE

habs mit IO::Select gelöst

gruß
.mike.
Gast Gast
 2007-02-22 22:47
#37454 #37454
Ich hab das gleiche Problem mike.

Kann es aber nicht lösen :/

Könntest Dz mir da helfen?
betterworld
 2007-02-23 15:24
#37455 #37455
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Guest,22.02.2007, 21:47]Ich hab das gleiche Problem mike.

Kann es aber nicht lösen :/

Könntest Dz mir da helfen?[/quote]
Schau Dir am besten die Dokumentation von CPAN:IO::Select an, da steht auch ein Beispiel.
.mike.
 2007-02-23 21:51
#37456 #37456
User since
2006-04-07
26 Artikel
BenutzerIn
[default_avatar]
Hallo Andy,

hier mal was von meinem Code
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $server = IO::Socket::INET->new(Proto => 'tcp',
                                                       LocalPort => $port,
                                                       Listen => 5,
                                                       Reuse => 1) || die "Socket: $!";

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

while (my @ready = $select->can_read()) {
    foreach my $handle (@ready) {
        if ($handle == $server) {
            my $newclient = $server->accept();
            $newclient->autoflush();
            $select->add($newclient);
            print $newclient "Hallo, bitte logge dich ein\n";
        }
        else {
            if (defined (my $line = <$handle>)) { # hier steht was der client geschickt hat und dann halt entsprechend reagieren...
            }
        }
    }

}

hab dann noch ein globales hash %users in dem einmal (nach dem login) name => handle und handle => name gespeichert wird und das bei jedem user der sich einloggt.
dann kann ich jewils über $users{name_eines_users} auf das bestimmte socket für diesen user zugreifen und so mehrere sockets managen

#edit:
wenn jemand ne bessere, sicherere oder effizientere methode kennt, dann bitte sagen :)
<< >> 6 Einträge, 1 Seite



View all threads created 2007-02-11 21:41.