Schrift
[thread]4300[/thread]

IO::Socket Problem ...

Leser: 3


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
weismat
 2005-07-04 01:56
#37640 #37640
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Arbeitet der Server zeilenorientiert (\n) als Trennzeichen?
Wie wärs mit recv SOCKET,SCALAR,LENGTH,FLAG als Alternative fürs Lesen und send SOCKET,MSG,FLAG fürs Schreiben?
Auf welcher Platform arbeitest Du?
esskar
 2005-07-04 14:32
#37641 #37641
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
perldoc -f recv
perldoc -f send
Strat
 2005-07-04 18:07
#37642 #37642
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: im Modul Socket gibt es konstanten fuer den Zeilenumbruch; wenn man die anstelle von \n verwendet, geht's meistens viel einfacher... (bevor ich das wusste, habe ich auch manchmal stundenlang fehler gesucht)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-07-04 22:41
#37643 #37643
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
haengt davon ab, wie man's sieht. wenn der client immer \n sendet, der server aber \r\n erwartet, dann geht was schief. Deshalb sende ich da immer die Konstante CRLF aus dem Modul Socket...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-07-08 16:18
#37644 #37644
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
kannst du feststellen, wo genau das script "stehenbleibt"? (vielleicht mit ein paar prints)

nebenbei: $/ setzt nur den Input record separator, d.h. nur beim lesen von einem handle wird nach $CRLF aufgesplittet... STDIN->getline() schneidet, wenn ich mich recht erinnere, einen ev. zeilenumbruch am ende nicht ab... d.h. du uebergibst das zeilenende des betriebssystems einfach weiter an das print $socket... wolltest du da nicht $CRLF oder so als Zeilenende haben?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-07-08 17:58
#37645 #37645
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann mal schritt fuer schritt:

also beim my $msg_out = STDIN->getline geht was schief... blockiert es, oder ist $msg_out undef (dann wird die schleife einfach "uebersprungen")?

wenn es blockiert: dann gib mal was ein, und beende deine eingabe mit Enter. Was passiert?

Gib was ein und beende deine Eingabe mit <Strg><d>: was passiert?

Gib was ein und beende deine Eingabe mit <Strg><z>: was passiert? (funktioniert nur ev. unter Windows, nicht unter Linux/Unix)\n\n

<!--EDIT|Strat|1120831399-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2005-07-08 23:50
#37646 #37646
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=J-jayz-Z,08.07.2005, 15:33]Selbst wenn ich dann ein
Code: (dl )
$msg_out =~ s/\n/CRLF/g;

mache, geht es nicht.[/quote]
Damit ersetzt du jedes Perl-interne Newline durch die Zeichenkette "CRLF", also die Buchstaben C-R-L-F!

In Perl gibt es keine echten benannten Konstanten, deshalb werden Pseudokonstanten wie hier CRLF intern als Funktionen realisiert (aber effizient, weil sie inline ersetzt werden koennen, siehe "Constant Functions" in perlsub). In der Ersetzung oben kann auf der rechten Seite aber nur ein Text stehen, deshalb wird dort kein Funktionsaufruf vorgenommen. Um korrekt zu ersetzen, muss man Perl sagen, dass auf der Ersetzungsseite eine Funktion steht, deren Ergebnis eingesetzt werden soll:
Code: (dl )
$msg_out =~ s/\n/CRLF/eg;

Beachte die Option /e fuer "execute".
Damit wird jedes "\n" durch "\015\012", also Carriage Return gefolgt von Line Feed, ersetzt.
Man kann es auch noch expliziter als Funktion schreiben:
Code: (dl )
$msg_out =~ s/\n/CRLF()/eg;
J-jayz-Z
 2005-07-09 01:36
#37647 #37647
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das ist ja schön und gut. Ich habe es zur Kentniss genommen und werde es mir auch merken, aber das hat leider nichts mit meinem Problem zu tun :(
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-03 03:31
#37648 #37648
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi, ich hab folgendes Problem:
Ich hab neu mit Netzwerkprogrammierung angefangen und mir ist völlig unklar, wieso der client hier nicht funktioniert...
Hier mein Code:
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket einbinden
use IO::Socket;

#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";

Ich kannwas eingeben, der Server zeigt mir auch, das eine Verbindung aufgebaut ist, aber ich bekomme keine Antwort vom Server. An dem Server liegt es aber nicht, in einer telnet Session geht alles wunderbar...

Danke schonmal für eure Hilfe!
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-04 14:26
#37649 #37649
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Jo, er arbeitet Zeilenorientiert mit \n.
Hmm, was ist gemeint mit Scalar bei recv?
Ich arbeite unter Linux
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
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



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