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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с логикой работы клиента 
:(
    Опции темы
errr
Дата 19.9.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть клиент для некого сервера. Который можеть посылать: "4","5","6"

Код клиента:
Код

my $socket = IO::Socket::INET->new("host:port");
my $readers = IO::Select->new();
$readers->add($socket); 
while (1) {
    my @ready = $readers->can_read;
    for my $handle (@ready) {
        if ($handle eq \*STDIN) {
            if (sysread(STDIN,$buffer,BUFSIZE) > 0) {
                     syswrite($socket,$buffer); #вводятся 4 5 6
               }    
         }
        if ($handle eq $socket) {
            if (sysread($socket,$buffer,BUFSIZE) > 0) {
                     Parse($buffer); 
                }
           }
    }
}

sub Parser { #обработчик данных принятых от сервера
    my ($incoming) = @_;
    return 1 if ($incoming==1);
    return 2 if ($incoming==2);
    return 3 if ($incoming==3);
}


Опишу сервер:
Сервер может посылать сообщения: "1","2","3". 
Причем он их посылает как ответ клиенту на его сообщения, так и самостоятельно без действий клиента (допустим, сообщает свой статус).

Вопрос.
Как бы сделать наиболее оптимально следующую вещь: 
Переслать сообщение "4" и потом, в зависимости от ответа сервера, переслать сообщение "5" или "6"

В данный момент у меня сделано примерно так:
Код

#...
        if ($handle eq \*STDIN) {
            if (sysread(STDIN,$buffer,BUFSIZE) > 0) { #вводятся 4 5 6
                     $mode=1 if ($buffer=4);
                     syswrite($socket,$buffer); 
               }    
         }
#...
sub Parser {
    my ($incoming) = @_;
    if ($incoming==1 && $mode=1) {
        $mode = 0;
        syswrite($socket,"6"); #посылается серверу
    }
    return 1 if ($incoming==1);
    return 2 if ($incoming==2);
    return 3 if ($incoming==3);
}

Но в реальной жизни этих функций в десятки раз больше, вот я и думаю, может у того кто занимался подобными проблемами есть какие-то наработки. 
То есть, послать, послать->принять это не проблема, а вот с послать->принять->послать-> уже хуже

Спасибо!


Это сообщение отредактировал(а) errr - 19.9.2007, 20:57
PM MAIL   Вверх
Nab
Дата 20.9.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Есть модули на CPAN реализующие такие вещи, также POE построен по похожему принципу, можете с ним ознакомиться, ну а лучше погуглите на словосочетание "метод конечных автоматов"...


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


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

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


 




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


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

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