Hi,
ich hab da ein großes Problem was Netzwerkprogrammierung angeht.
Und zwar hab ich das Buch "Netzwerkprogrammierung in Perl" hier und versuche mich darin einzuarbeiten. Nur wie soll ich das machen, wenn sogar die beispiele nicht gehen... :ghostface:
Ich hab den Echo Server etwas kommentiert und sonst inhaltlich aus dem Buch nur sachgemäß angepasst.
Hier mein funktionierender Server:
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
69
#!/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;
funktioniert mit Telnet einwandfrei...
Hier mein Client, der nicht funktioniert. Es werden keine Daten an das Socket geschickt...
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden
#IO::Socket einbinden
use IO::Socket qw(:DEFAULT :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("$host:$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";
Wäre es vielleicht möglich, das mir jemand, mein client verbessert, oder einfach einen neuen, funktiobierenden, schreibt?
Dank euch 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