Schrift
[thread]4300[/thread]

IO::Socket Problem ... (Seite 2)

Leser: 3


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
weismat
 2005-07-04 17:43
#37650 #37650
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Ich zeige Dir mal meinen Code aus einer Bibliothek, die ich geschrieben habe:
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
sub receive {
my($message, $j, $i, $length, %result, $help, $result);
my $self=$_[0];
my $remote=$self->{remote};
if (defined($self->{buffer})) {
debug("read from buffer", "info");
$message=$self->{buffer};
} else {
debug("read from socket", "info");
$i =$remote->recv($help, 4096);
$message=$help;
while (substr($help, length($help)-1) ne "\n") {
$remote->recv($help, 4096);
$message=$message.$help;
debug("Read again from socket");#comment out
}
}
debug("Processing: $message");#comment out
if (length($message)==index($message,"\n")+1) {
debug("one message");
$result=$message;
$self->{buffer}=undef;
}
else {
debug("multiple messages");
$result=substr($message, 0, index($message, "\n"));
$self->{buffer}=substr($message, index($message, "\n")+1);
}
return $result;
}

Ein weiteres Problem ist nämlich, daß Du mit dem Standard Recv maximal 4096 pro Lesen einliest und dann auch mehr als eine Message einlesen kannst.
Auf Wunsch kann ich Dir auch mal eine ganze Bibliothek zukommen lassen.
J-jayz-Z
 2005-07-04 19:45
#37651 #37651
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
hmm, ist das ein Client oder ein Serverseitiges Problem mit \n ?
Weil wie gesagt: Der Server geht mit einer telnet session Problemlos
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-07 18:33
#37652 #37652
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
lol, das hab ich gar nicht realisiert, aber zumindest beim Server gemacht ^^
Jetzt sieht mein Client so aus:
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket einbinden
use IO::Socket qw(:DEFAULT :crlf);

#CRLF als Zeilenende festlegen
$/ = CRLF;

#Konstante definieren
use constant MY_HOST => '127.0.0.1';
use constant MY_PORT => '2050';

#Variablen deklarieren
my $host = shift || MY_HOST;
my $port = shift || MY_PORT;

#IO::Socket Modul erzeugen
my $socket = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port
) || die "Fehler beim Socket öffnen: $!";

#Schleife, für die Kommunikation
while(defined(my $msg_out = STDIN->getline)) {

#Nachricht verschicken
print $socket $msg_out;

#Nachrichten empfangen
my $msg_in = <$socket>;

#Nachricht ausgeben
print $msg_in;
}

#Socket schließen
$socket->close || warn "Fehler beim schließen des Sockets: $@";

warn "Verbindung beendet..\n";


und mein Server so
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket Modul einbinden, mit DEFAULT und CRLF
use IO::Socket qw(:DEFAULT :crlf);

#Konstante definieren
use constant MY_PORT => '2050';

#CRLF als Zeilenende verwenden
$/ = CRLF;

#$quit deklarieren
my $quit = 0;

#STRG+C abfangen
$SIG{'INT'} = sub { $quit++; };

#$port Wert zuweisen
my $port = shift || MY_PORT;

#IO::Socket Objekt erzeugen
my $socket = IO::Socket::INET->new(
Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1) || die
"Konnte Socket Objekt nicht erzeugen: $!";

warn "Warte auf ankommende Verbindung auf Port $port...\n";

#Schleife, wenn $quit nicht wahr ist
while(!$quit) {

#Verbindungen akzeptieren
next unless my $session = $socket->accept;

#Peer host identifizieren
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;

#Verbindungsport überprüfen
my $Port = $session->peerport;

#Meldung ausgeben
warn "Verbindung von $peer, $Port\n";

#Schleife, was bei einer Verbindung passiert
while(<$session>) {
my $msg_out = $_ . CRLF;
print $session $msg_out;
}

#Verbindungsende ausgeben
warn "Verbindung von $peer, $Port beendet...\n";

#Session schließen
close($session);
}

#Socket schließen
close $socket;

Somit sollte ja CRLF als Zeilenende gehandhabt werden und das Problem sollte gelöst sein.
Gut, ist das selbe Verhalten... :(
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-08 02:10
#37653 #37653
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmm, ich habe gerade festgestellt, das meine Schleife im Client gar nicht abgearbeitet wird...
Hat jemand ne idee, woran das liegen kann? ? ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-08 17:33
#37654 #37654
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es bleibt stehen. Die Schleife wird nie ausgeführt...
Selbst wenn ich dann ein
Code: (dl )
$msg_out =~ s/\n/CRLF/g;

mache, geht es nicht. Ich hab einiges versucht :(
Ist aber doch eigentlich ein totaler einfacher code...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-08 18:26
#37655 #37655
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn ich es mit STRG-D beende, passiert gar nichts.
Wenn ich mit enter beende, komm ich in eine neue Zeile aber der Server antwortet nicht. Also reagiert nicht. Sonst keine Idee?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2005-07-09 01:29
#37656 #37656
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
und um sicher zu gehen, dass du alles richtig machst

Code: (dl )
$msg_out =~ s/\r?\n/CRLF()/eg; 
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2005-07-04 01:56.