Почему мой Perl-сервер перестает работать, когда я нажимаю «ввод»? - PullRequest
2 голосов
/ 10 мая 2010

Я создал сервер в Perl, который отправляет сообщения или команды клиенту. Я могу отправлять команды очень хорошо, но когда меня запрашивают команду на моем сервере, которую я создал, если я нажимаю «ввод», сервер выходит из строя. Почему это происходит?

Вот часть моего кода:

print "\ nСоединение получено с IP-адреса $ peer_address через порт $ peer_port"; $ closed_message = "\ n \ tТерминированный сеанс клиента ...";

 while (1)
 {

     print "\nCommand: ";

     $send_data = <STDIN>;
     chop($send_data); 

     if ($send_data eq 'e' or $send_data eq 'E' or $send_data eq ' E' or $send_data eq ' E ' or $send_data eq 'E ' or $send_data eq ' e' or $send_data eq ' e ' or $send_data eq 'e')
        {

        $client_socket->send ($send_data);
        close $client_socket;
        print "$closed_message\n";
        &options;
        }

     else
        {
        $client_socket->send($send_data);
        }

        $client_socket->recv($recieved_data,8000);
        print "\nRecieved: $recieved_data";
}

}

1 Ответ

3 голосов
/ 11 мая 2010

Ваш сервер блокирует вызов $client_socket->recv(...) - сервер и клиент заблокированы, каждый ждет ответа другого.

Попробуйте поставить эту строку после chop():

next unless length $send_data;  # restart the loop if no command submitted

Теперь, доработав ваш пример, я думаю, что происходит вот что:

$send_data = <STDIN>;            # $send_data := "\n"
                                 # you just input a blank line with [ENTER]

chop($send_data);                # $send_data := ""

$client_socket->send($send_data) # you send a zero-length buffer
                                 # On my system, this does generate a syscall for
                                 # the sender, but no data is transmitted

$client_socket->recv($buf, 8192) # Hang indefinitely.  Your client application
                                 # received no command, and so it has sent no
                                 # response.

Это всего лишь предположение. Как прокомментировал @ DVK , мы на самом деле не знаем ваших симптомов, и из вашего описания трудно угадать, что происходит. Это, однако, напоминает проблему, которую я укусил в прошлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...