Das hier funktioniert bei mir:
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;
#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 = $_;
print $session $msg_out;
}
#Verbindungsende ausgeben
warn "Verbindung von $peer, $Port beendet...\n";
#Session schließen
close($session);
}
#Socket schließen
close $socket;
Client:
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>)) {
#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";