2012-03-29 17 views
2

Hier auszuführen ist ein Beispiel, das fehlschlägt:Einfaches Perl-Programm Fehler

#!/usr/bin/perl -w 
# client.pl 
#---------------- 

use strict; 
use Socket; 

# initialize host and port 
my $host = shift || 'localhost'; 
my $port = shift || 55555; 
my $server = "10.126.142.22"; 

# create the socket, connect to the port 
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]) 
    or die "Can't create a socket $!\n"; 
connect(SOCKET, pack('Sn4x8', AF_INET, $port, $server)) 
     or die "Can't connect to port $port! \n"; 

my $line; 
while ($line = <SOCKET>) { 
    print "$line\n"; 
} 
close SOCKET or die "close: $!"; 

mit dem Fehler:

Argument "10.126.142.22" isn't numeric in pack at D:\send.pl line 16. 
Can't connect to port 55555! 

Ich benutze diese Version von Perl:

This is perl, v5.10.1 built for MSWin32-x86-multi-thread 
(with 2 registered patches, see perl -V for more detail) 

Copyright 1987-2009, Larry Wall 

Binary build 1006 [291086] provided by ActiveState http://www.ActiveState.com 
Built Aug 24 2009 13:48:26 

Perl may be copied only under the terms of either the Artistic License or the 
GNU General Public License, which may be found in the Perl 5 source kit. 

Complete documentation for Perl, including FAQ lists, should be found on 
this system using "man perl" or "perldoc perl". If you have access to the 
Internet, point your browser at http://www.perl.org/, the Perl Home Page. 

Während Ich führe den netcat Befehl auf der Serverseite aus. Telnet funktioniert.

Antwort

7

Das Problem ist, dass die Packungsvorlage Sn4x8 fehlerhaft ist - und sollte nicht an erster Stelle verwendet werden. Etwas wie pack_sockaddr_in($port, inet_aton($server)), wie in Socket dokumentiert, würde eher funktionieren.

Aber im Idealfall würden Sie den Low-Level-Socket-Code überhaupt nicht verwenden. Hier ist ein schönes Stück Code, der es tut IO::Socket verwenden, die auch ein zentraler Bestandteil von Perl für die letzten 15 Jahre:

use strict; 
use IO::Socket::INET; 

my $host = shift || 'localhost'; # What is this here for? It's not used 
my $port = shift || 55555; 
my $server = "10.126.142.22"; 

my $socket = IO::Socket::INET->new(
     PeerAddr => $server, 
     PeerPort => $port, 
     Proto => 'tcp', 
) or die "Can't connect to $server: [email protected]"; 

while (my $line = <$socket>) { 
     print $line; # No need to add \n, it will already have one 
} 

close $socket or die "Close: $!"; 
1

Arbeiten wie das für mich:

connect(SOCKET, pack('S n a4 x8', AF_INET, $port, $server)) 
     or die "Can't connect to port $port! \n"; 

Ich denkt, Ihr Original Skript AF_INET ist Unicode oder so etwas. Wenn Sie die A löschen und erneut schreiben, funktioniert es.

0

Das ist die Linie, die die Verpackungsarbeit machen:

connect(SOCKET, pack('SnC4x8', AF_INET, $port, split /\./,$server)) 
or die "Can't connect to port $port! \n";