Простая Perl-программа не может быть выполнена - PullRequest
2 голосов
/ 29 марта 2012

Вот пример, который терпит неудачу:

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

с ошибкой:

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

Я использую эту версию 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.

Пока я выполняю команду netcat на стороне сервера. Telnet работает.

Ответы [ 3 ]

7 голосов
/ 29 марта 2012

Проблема в том, что шаблон пакета Sn4x8 содержит ошибку - и не должен использоваться в первую очередь.Нечто подобное pack_sockaddr_in($port, inet_aton($server)), как описано в Socket, с большей вероятностью будет работать.

Но в идеале вы вообще не использовали бы низкоуровневый код Socket.Вот хороший фрагмент кода, который делает это, используя IO :: Socket , который также является основной частью Perl в течение последних 15 лет:

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: $@";

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

close $socket or die "Close: $!";
1 голос
/ 29 марта 2012

Работает для меня так:

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

Я думаю, что ваш оригинальный скрипт AF_INET - это Unicode или что-то в этом роде.Если вы удалите A и напишите снова, это сработает.

0 голосов
/ 25 августа 2013

Это линия, которая заставляет упаковку работать:

connect( SOCKET, pack( 'SnC4x8', AF_INET, $port, split /\./,$server ))
or die "Can't connect to port $port! \n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...