Perl TCP не считывает тайм-аут - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь прочитать данные по TCP с помощью модуля IO :: Socket.Я читаю данные либо используя функцию 'recv', либо <TCP_SOCKET>.Случайно, я обнаружил, что программа зависает в той конкретной строке, где я пытаюсь прочитать данные по TCP.Программа не запускается и не завершается, пока я не убью ее.Почему это произошло или как этого избежать?

Спасибо ...

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Вам необходимо выполнить

выберите

, чтобы определить, есть ли какие-либо данные, ожидающие до

RECV

функция, чтобы избежать зависания. О какой платформе вы говорите?

Посмотрите на выберите документ и IO :: Socket doc .
В отношении других документов я бы порекомендовал либо «Сетевое программирование на Perl» от Stein, либо классическое «Сетевое программирование Unix» Стивенса.
Практически он основан на использовании протокола эхо / пинга, потому что не все проблемы физической сети вызывают исключения (например, при отключении сетевого кабеля на одном компьютере, удаленный компьютер не видит его).

1 голос
/ 03 марта 2011

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

use IO::Socket::INET;
my $socket = IO::Socket::INET->new(  PeerAddr => $HOST,
    PeerPort => $PORT,
    Proto    => 'tcp',
    Timeout  => 20,    # It seems to be ignored.
);


eval {
       local $SIG{ALRM} = sub { die "TimedOut" };
       alarm 20; # 20 seconds global timeout for receiving.

       $res = <$socket>;

       # your code here. 

       # Disable timeout alarm after receiving.
       alarm 0;
    }

    if ($@) {
       if ($@  eq "TimedOut") {
          print "Warning: timeout receiving\n";
       }
       else {
          print "Error receiving.";
       }
    }
    close ($socket);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...