Schrift
[thread]4308[/thread]

Sockets: Zwei Clients verbinden

Leser: 1


<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten
esskar
 2005-04-14 14:24
#37758 #37758
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
weil dein protokol dann so aussieht
nameesskar

warum nicht
name: esskar
Froschpopo
 2005-04-18 11:24
#37759 #37759
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie kann ich es denn machen, dass derjenige der die nachricht bekommt auch weiss wer sie geschickt hat ?
sri
 2005-04-18 23:20
#37760 #37760
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=phaylon,18.04.2005, 17:24][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.[/quote]
"Wenn du das Rad schon neu erfindest, mach es wenigestens besser!" -- Larry
Strat
 2005-04-19 15:28
#37761 #37761
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Froschpopo,18.04.2005, 16:31]wieso chatserver ? ich will zwei Programme miteinander sprechen lassen...[/quote]
was bedeutet peer2peer? dass beide programme sowohl eine server- als auch client-rolle einnehmen...
in dem tutorial sind eine menge fragen beantwortet, die du schon gestellt hast, und auch einige recht gute ideen... aber wenn es dich nicht interessiert, ist es mir nun auch egal...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
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 ?
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-->
Froschpopo
 2005-04-14 14:51
#37764 #37764
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ok... name: esskar

Ich möchte später, dass wenn $line z.b. den befehl: msg esskar hallo enthält, diese Nachricht dann auch an dich gehen würde. Wie bekomme ich jetzt eine Verknüpfung der Sockets hin? Wie kann man das hinbekommen?
renee
 2005-04-14 15:50
#37765 #37765
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es sind keine Sockets untereinander "verbunden". Der Server dient als Vermittlung. Stell Dir das so wie die Post. Die Post ist ebenfalls nur Vermittler zwischen Sender und Empfänger... Der Absender schreibt die Adresse auf den Brief (hier der Name des Empfängers nach "msg"). Die Post sucht dann den richtigen Postweg und leitet die Nachricht weiter.

Hier läuft das ähnlich:
Der Absender sagt mit msg <name>, wem er die Nachricht schicken will. Die Vermittlung (der Server) schaut im Hash nach, welcher der richtige Post weg ist und schickt die Nachricht über diesen Kanal zum Empfänger...
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-19 03:10
#37766 #37766
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
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 ?
Crian
 2005-04-19 13:58
#37767 #37767
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Aber vielleicht hilft der Knoblauch doch besser ;-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten



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