2012-03-29 4 views
2

Voici un échantillon qui échoue:programme simple perl ne pas exécuter

#!/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: $!"; 

avec l'erreur:

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

J'utilise cette version de 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. 

Bien que J'exécute la commande netcat du côté serveur. Telnet fonctionne.

Répondre

7

Le problème est que le modèle de pack Sn4x8 est en erreur - et ne doit pas être utilisé en premier lieu. Quelque chose comme pack_sockaddr_in($port, inet_aton($server)) comme documenté dans Socket serait plus susceptible de fonctionner.

Mais idéalement, vous n'utiliserez pas du tout le code Socket de bas niveau. Voici un agréable morceau de code qui le fait en utilisant IO::Socket, qui est aussi une partie essentielle de Perl pour les 15 dernières années:

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

fonctionne comme ceci pour moi:

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

Je pense que votre original Le script AF_INET est unicode ou quelque chose. Si vous supprimez le A et réécrivez cela fonctionne.

0

Ceci est la ligne qui font le travail d'emballage:

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