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

Froschpopo
 2005-04-14 08:19
#37763 #37763
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich habe einen Server:
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
use strict;
use warnings;

use IO::Socket::INET;
use IO::Select;

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 %users = ();

while(my @readable = $select->can_read) {
    foreach my $socket (@readable) {
        if($socket == $server) {
            my ($client, $ip) = $socket->accept;
            $select->add($client);
            my ($port, $iaddr) = unpack_sockaddr_in($ip);
            $iaddr = inet_ntoa($iaddr);
           $users{rand(100)} = $iaddr;
            print "New Client connected: $iaddr\n";
            $client->print("Welcome\n");
        } else {
            my $line = $socket->getline;
            if(defined $line) {
               
 $line =~ s!\r?\n$!!g;
               
 if(lc($line) eq "quit") {
               
     print "Client quits\n";
               
     delete_socket($select, $socket);
               
 } else {
               
     print "Client says: [$line]\n";
               
     $socket->print("$line\n");
               
 }
            } else {
               
 print "Connection closed by client\n";
               
 delete_socket($select, $socket);
            }
        }
    }
}

sub delete_socket {
  my ($sel, $sock) = @_;
  $sel->remove($sock);
  $sock->close;
}

Jetzt möchte ich ermöglichen, dass sich Clients auch untereinander über den Server verständigen können. So ähnlich wie bei einem Chat, wenn zwei miteinander reden.

Also, zwei Clients sollen Nachrichten miteinander austauschen können. Wie fängt man da am besten an?

Ich hab schonmal damit begonnen, die Adressen der eingehenden Verbindungen in eine lesbare IP-Adresse zu entpacken und einen user-Hash zu erstellen.
Der Schlüssel des Hashes ist der Name des Clients und der Wert die IP-Adresse.
Code: (dl )
1
2
3
4
5
6
7
my ($client, $ip) = $socket->accept;
$select->add($client);
my ($port, $iaddr) = unpack_sockaddr_in($ip);
$iaddr = inet_ntoa($iaddr);
$users{rand(100)} = $iaddr;
print "New Client connected: $iaddr\n";
$client->print("Welcome\n");


Nun will ich ermöglichen, dass wenn ein Client einen Name sendet, er mit dem dazugehörigen Client verbunden wird.\n\n

<!--EDIT|Froschpopo|1113453354-->

View full thread Sockets: Zwei Clients verbinden