Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]4308[/thread]

Sockets: Zwei Clients verbinden (Seite 4)

Leser: 1


<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten
GwenDragon
 2005-04-19 12:39
#37788 #37788
User since
2005-01-17
14836 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, es gibt eins. Messages auf Plausibilität prüfen.
Und den Server stabil PROGRAMMIEREN! *arrghh*
Strat
 2005-04-19 18:09
#37789 #37789
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,19.04.2005, 14:02]Vielleicht sollte man Störche im Serverraum platzieren? ;) :D[/quote]
oder prinzessinnen aehm operatorinnen? *freiwilligFuenfEuroInDieChauviKasseLeg*
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Froschpopo
 2005-04-14 10:32
#37790 #37790
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
das könnte man ja ungefähr so machen:
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
if($socket == $server) {
     my $client = $socket->accept;
     $select->add($client);
     $client->print("Connected"); # Aufforderung Username zu senden
} else {
      my $line = $socket->getline;
      if(defined $line) {
$line =~ s!\r?\n$!!g;
           if(substr($line,0,4) eq 'name') {
            push @users, substr($line,4,20);
                  $socket->print("In Userlist aufgenommen\n");
           } else {
            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);
}
}

Erläuterung:
- Verbindung wird aufgebaut.
- Der erste String an den Server muss ein Name sein, ansonsten darf Client nicht kommunizieren\n\n

<!--EDIT|Froschpopo|1113460596-->
Froschpopo
 2005-04-18 11:50
#37791 #37791
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=renee,18.04.2005, 09:47]dann ändere doch einfach das protokoll:

msg empfänger sender text[/quote]
dann kann der absender aber nen anderen username angeben als den den er wirklich besitzt...
Strat
 2005-04-18 17:34
#37792 #37792
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vielleicht hilft dir How to Write a Chat Server...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
zipster
 2005-04-19 17:46
#37793 #37793
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
snarf
 2005-05-11 16:02
#37794 #37794
User since
2003-08-14
77 Artikel
BenutzerIn
[default_avatar]
[quote=Froschpopo,11.05.2005, 09:51]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 ?[/quote]
Ohne Dir jetzt eine detaillierte Antwort auf Deine Frage zu geben ... Hast Du Dir schon einmal überlegt, warum bei größeren Datenmengen Verzögerungen eintreten? Große Datenmengen über einen Port gehandelt führen wohl zwangsläufig zu einem "Stau" - was sollte da ein fork helfen?
esskar
 2005-04-14 13:30
#37795 #37795
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das ist kein gutes protokoll;
nimm den ansatz von kabel!
Froschpopo
 2005-04-18 11:49
#37796 #37796
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hast du dir den code überhaupt angesehen ? :D
ich dachte da an sowas wie:

Leider funktioniert das aus irgendeinem grund nicht...
Code: (dl )
1
2
3
4
5
6
7
8
9
$from = get_username($hash{$1});

$socket_tmp->print("Nachricht von: $from\n");

sub get_username {
foreach (my ($user_key, $user_value) = each(%hash)) {
return $user_key and last if $user_value eq $_[0];
}
}
Froschpopo
 2005-04-18 18:31
#37797 #37797
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wieso chatserver ? ich will zwei Programme miteinander sprechen lassen...

Aber zurück zum Thema:
Wir haben ganz vergessen den User wieder aus dem Hash zu löschen. Wenn ich jetzt gerne wissen möchte, wessen Socket durch delete_socket() gelöscht wird, dann dachte ich mache ich folgendes:

Code: (dl )
1
2
3
4
5
6
7
sub delete_socket {
my ($sel, $sock) = @_;
my %delete_hash = reverse %hash;
print "Verbindung zu Client $delete_hash{$sock} wurde abgebrochen\n";
$sel->remove($sock);
$sock->close();
}

warum zeigt er da nichts an?
<< |< 1 2 3 4 5 >| >> 42 Einträge, 5 Seiten



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