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

renee
 2005-04-18 12:05
#37773 #37773
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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);
        }
     }
  }
}
\n\n

<!--EDIT|renee|1113811865-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Sockets: Zwei Clients verbinden