Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервер на Perl, Два одинаковых сервера 
V
    Опции темы
OutlawZ
Дата 24.6.2012, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Добрый вечер, можете сказать что я делаю не так? Дело в том, что написал два сервера один работает как надо а другой не хочет работать правильно. т.е приведу код:

Код

#!perl

use POSIX;
use POSIX ":sys_wait_h";
use IO::Socket;
use IO::Handle;

my ($server, $client, $port);
    $port = '23';
    
sub REAPER {        
    while ((my $waitedpid = waitpid(-1,WNOHANG)) > 0) { }
    $SIG{CHLD} = \&REAPER;  
}
    
    $server = IO::Socket::INET->new(
        LocalPort    => $port,
        TYPE        => SOCK_STREAM,
        Listen        => 10
    ) or die "$!";

    while ($client = $server->accept()) {
        $SIG{CHLD} = \&REAPER;
        defined(my $c_pid = fork()) or die "$!";
        next if $c_pid;
        if ($c_pid) {
            close($server);
        }
        $client->autoflush(1);
        print $client "\$";
        
        while(<$client>) {
            chomp($_);
            if ($_ =~ /cmd/) {
                print $client "Running CMD\n\r";
            } elsif($_ =~ /exit/) {
                close($client);
                exit;
            }
        }
        continue {
            print $client "\$";
        }
        exit;
    }
    continue {
        close($client);
    }


Тестовый макет сервера, он отрабатывает как надо получает данные и отправляет данные пользователю, т.е все хорошо, второй код который написал по аналогии с этим работает криво:
Код

#!perl

use Socket;
use POSIX;
use POSIX ":sys_wait_h";

my $client;
my $sockaddr_in;
my $port = 23;

sub REAPER {        
    while ((my $waitedpid = waitpid(-1,WNOHANG)) > 0) { }
    $SIG{CHLD} = \&REAPER;  
}

socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp') ) or die "$!";
    $sockaddr_in = sockaddr_in(23,INADDR_ANY);
bind(SERVER,$sockaddr_in) or die "$!";
listen(SERVER,SOMAXCONN);

while ($client = accept(CLIENT,SERVER)) {
    $SIG{CHLD} = \&REAPER;
    defined ( my $child_f = fork() ) or die "$!";
    next if $child_f;
    
    if ($child_f) {
        close(SERVER);
    }
    
    while ( sysread(CLIENT, $data, 1024)) {
        chomp($data);
        print $data;
            if ($data =~ /cmd/) {
                print CLIENT "Running CMD\n\r";
            } elsif($data =~ /exit/) {
                close(CLIENT);
                exit;
            }    
    }
    continue {
        print CLIENT "\$";
    }
    exit;
}


continue {
    close(CLIENT);
}



Все тоже самое только используется Socket вместо IO::Socket, вот с этим и проблема дело в том что данные он получает но нечего пользователю не отправляет, убирал разветвление в это случае данные клиенту приходят. Вопрос в том что я не так делаю во второй версии? Блокировка? Если у кого есть способ отладки таких случаев поделитесь. Зарание спасибо.


--------------------
user posted image
user posted image
PM MAIL   Вверх
DurRandir
Дата 25.6.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Код

$client->autoflush(1);

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1976 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.