Schrift
[thread]4308[/thread]

Sockets: Zwei Clients verbinden (Seite 2)

Leser: 1


<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten
Strat
 2005-04-19 18:57
#37768 #37768
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
und wenn man die stoerche mit knoblauch fuettert? doppelt haelt besser, oder?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2005-04-14 09:52
#37769 #37769
User since
2005-01-17
14835 Artikel
Admin1
[Homepage]
user image
Wie im Chat, in die Message gehört der Empfänger mit hinein.

Quote
Nun will ich ermöglichen, dass wenn ein Client einen Name sendet, er mit dem dazugehörigen Client verbunden wird.
Nur zum Verständnis, ein Server kann nicht mit einem Client verbinden. Der Client muß zuerst an den Server.
Froschpopo
 2005-04-14 13:39
#37770 #37770
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
den Ansatz hatte ich ja hier schonmal gewagt:
Code: (dl )
1
2
3
           if(substr($line,0,4) eq 'name') {
                 push @users, substr($line,4,20);
                 $socket->print("In Userlist aufgenommen\n");

@users würde dann eine Liste mit allen angemeldeten Clients sein die schon einen Name gesendet haben.
In der delete_socket() wird dann der Name aus der Liste wieder entfernt.\n\n

<!--EDIT|Froschpopo|1113471589-->
Froschpopo
 2005-04-14 15:43
#37771 #37771
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber mal angenommen, eine dritte Socket ist gerade auch mit tester verbunden der gerade mit renee verbunden ist.

Die Dritte könnte doch dann theoretisch das gespräch zwischen den beiden abhören oder ?\n\n

<!--EDIT|Froschpopo|1113479050-->
renee
 2005-04-18 11:47
#37772 #37772
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann ändere doch einfach das protokoll:

msg empfänger sender text
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/
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/
Froschpopo
 2005-04-18 16:15
#37774 #37774
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
danke funzt prima :-)
Wenn ich jetzt alle User davon benachrichtigen will, wenn jemand neues sich angemeldet hat, gibts da ne Funktion für oder muss ich dann den Hash abarbeiten und jeden einzelnen anschreiben... ? Gibt doch sicher auch ne Möglichkeit alle Socketverbindungen anzuschreiben oder?
Gast Gast
 2005-04-18 19:24
#37775 #37775
[quote=sri,18.04.2005, 14:26][/quote]
Quote
Warum muss eigendlich jeder sein eigenes kleines (in diesem Fall extrem schlechtes) Protokoll machen?

Es gibt doch schon IRC und Jabber!!!

Ganz einfach. Stell dir vor, wir würden seit der Erfindung des Rades immer noch die selbe ovale Holzplatte verwenden, die wir mit Steinen zurechthauen.

Ich bin ja auch dafür, Räder nicht neu zu erfinden, aber Gründe gibt es mehr als genug, dies doch zu tun.
pq
 2005-04-19 12:17
#37776 #37776
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,19.04.2005, 01:10]ein böswilliger Client könnte den Server angreifen und abstürzen lassen indem er einfach kein leerzeichen am ende eines streams sendet. Gibt es dafür ein Hausmittel ?[/quote]
ja, gegen böswilige klienten solltest du immer gewappnet sein und den
serverraum mit knoblauch bestücken, das schreckt die klienten ab.

SCNR
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
sri
 2005-04-19 15:55
#37777 #37777
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ob das auch bei Froeschen funktioniert? :)
<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten



View all threads created 2005-04-14 14:24.