Автор Тема: ошибка эхо-сервера tcp  (Прочитано 3485 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tlalok

  • Коллежский регистратор
  • *
  • Сообщений: 5
  • Репутация: 0
ошибка эхо-сервера tcp
« : ЅЮпСам 28, 2007, 04:02:02 pm »
Товарищи, помогите пожалуста. Беру прогу из примера в книжке, а она не работает. При запуске выдаёт синтаксическую ошибку в помеченной строке, хотя я там никакой ошибки не вижу. Сокет вроде правильно открыт. Посмотрите пожалуста и ткните , если я такой слепой(( ну правда не вижу(( На всяк случай : пишу в XP, пример взят из книжки "Разработка сетевых программ на перл". О программе: эхо-сервер ждёт запроса от клиента(клиент ниже) и возвращает посланную клиентом строку в перевёрнутом виде :" Hi world -> dlrow iH". Использую ActivePerl-5.8.8.822. Вобщем, попробуйте у себя запустить.
эхо -сервер:
#! /usr/bin/perl

use strict;
use Socket;
use IO::Handle;
use constant MY_ECHO_PORT => 2007;

my ($bytes_out,$bytes_in)=(0,0);
my $port=shift || MY_ECHO_PORT;
my $protocol=getprotobyname('tcp');

$SIG{'INT'} = sub {
                   print STDERR "bytes_sent = $bytes_out, bytes_received = $bytes_in\n";
                   
                   exit 0;
                   }
                   
socket(SOCK,AF_INET,SOCK_STREAM,$protocol) or die "soket falied: $!";     #<-- ошибка здесь
setsockopt(SOCK, SOL_SOCKET, SO_REUSADDR, 1) or die "can't set SO_REUSADDR: $!";
my $my_addr=sockaddr_in($port,INADDR_ANY);
bind(SOCK, $my_addr) or die "bind() falied: $!";
listen(SOCK, SOMAXCONN) or die "listen() falied: $!";
warn "waiting for incoming connections on port $port...\n";

while (1) {
           next unless my $remote_addr = accept(SESSION, SOCK);
           my ($port, $hisaddr) = sockaddr_in($remote_addr);
           warn "Connection from [", inet_ntoa($hisaddr), ", $port]\n";
           SESSION->autoflush(1);
           
           while (<SESSION>) {
                              $bytes_in += length($_);
                              chomp;
                              my $msg_out = (scalar revers $_) . "\n";
                              print SESSION $msg_out;
                              $bytes_out += length($msg_out);
                              }
                             
           warn "Connection from [", inet_ntoa($hisaddr), ",$port] finished\n";
           close SESSION;
           }

close SOCK;



эхо-клиент:

#! /usr/bin/perl

use strict;
use Socket;
use IO::Handle;

my ($bytes_out,$bytes_in)=(0,0);
my $host=shift || 'localhost';
my $port=shift || getservbyname('echo','tcp');
my $protocol=getprotobyname('tcp');
$host=inet_aton($host) or die "host: unknown host";
socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die "soket falied: $!";
my $dest_addr=sockaddr_in($port,$host);
connect(SOCK, $dest_addr) or die "connect falied: $!";
SOCK->autoflush(1);

while (my $msg_out=<>) {
                        print SOCK $msg_out;
                        my $msg_in = <SOCK>;
                        print $msg_in;
                        $bytes_out += length($msg_out);
                        $bytes_in += length($msg_in);
                        }

close SOCK;
print STDERR "bytes_sent=$bytes_out, bytes_received=$bytes_in\n";


« Последнее редактирование: ЅЮпСам 28, 2007, 04:04:42 pm от tlalok »

Оффлайн tlalok

  • Коллежский регистратор
  • *
  • Сообщений: 5
  • Репутация: 0
Re: ошибка эхо-сервера tcp
« Ответ #1 : јРав 17, 2008, 07:21:41 pm »
Синтаксической ошибки в указанной Вами строке нет. Возможно нужно просто перезагрузиться( да да и такое бывает особенно в винде:)) ) Зато нашёл у вас ошибку в следущей строке - предпоследний параметр в setsockopt - не SO_REUSADDR , а  SO_REUSEADDR. Строка полностью:  setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, 1) .  Вобщем даю заново полный код - у меня работает :

#! /usr/bin/perl

use strict;
use Socket;
use IO::Handle;
use constant ECHO_PORT => 2007;

my ($a, $b) = (0,0);

my $port = shift || ECHO_PORT;
my $protocol = getprotobyname('tcp');

$SIG{'INT'} = sub {
                   print STDERR "bytes_sent = $a, bytes_received = $b\n";
                   exit 0;
                   };

socket (SOCK, AF_INET, SOCK_STREAM, $protocol) or die "socket() failed: $!";
setsockopt (SOCK, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set SO_REUSADDR: $!";

my $addr = sockaddr_in($port, INADDR_ANY);

bind (SOCK, $addr) or die "bind() failed: $!";
listen (SOCK, SOMAXCONN) or die "listen() failed: $!";

warn "waiting for incoming connections on port $port...\n";

while (1) {
           next unless my $remote_addr = accept(SESSION, SOCK);
           my ($port, $hisaddr) = sockaddr_in($remote_addr);
           warn "Connection from [", inet_ntoa($hisaddr), ", $port]\n";

           SESSION->autoflush(1);
           
           while (<SESSION>) {
                              $b += length($_);
                              chomp;
                     
                              my $msgout = (scalar reverse $_) . "\n";
                              print SESSION $msgout;

                              $a += length($msgout);
                              }
   
           warn "Cannection from [", inet_ntoa($hisaddr), ", $port] finished\n";

           close SESSION;
           }

close SOCK;