0

次のコードを使用しています。20秒後にタイムアウトして接続を閉じたいのですが、アラームを試してみましたが、何も機能しませんでした。これが私のコードです:

my $socket_resp = IO::Socket::INET->new(Blocking => 0, LocalPort => $comm_port, Proto => 'udp', Timeout => 2);
    $socket_resp->setsockopt(SO_RCVTIMEO, SO_RCVTIMEO, 10);
    print "Waiting for Response On Port $comm_port\n";
    while (my $recieved_data = $socket_resp->getline()) {
        chomp($recieved_data);
        print "$recieved_data\n";
        if ($recieved_data =~ m/^done/i) {
            last;
        }
    }

    $socket_resp->close();
4

1 に答える 1

0

他の質問で示唆されているように、読み取りループ全体をアラームでラップすると、おそらくあなたが望むことをするでしょう。コードを表示しないため、以前の試行が失敗した理由がわかりません。

とはいえ、SO_RCVTIMEOも、少し異なりますが、機能させることができます。

この場合、非ブロッキングソケットではなくブロッキングソケットが必要です。また、setsockopt正しくする必要があります。これには、SOL_SOCKETとpack()ingが必要struct timevalです。

my $s = IO::Socket::INET->new(Proto => 'udp', ...);            # N.B.: blocking
$s->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 20, 0));  # N.B.: pack()
while (<$s>) {
  ...
}

さて、上記は、への基礎となる呼び出しごとに20秒待機します。これは、アプリケーションに返されるread()数よりも多い場合があります。つまり、アプリケーションを1つのデータグラムで送信し、その後何も送信しない場合、20秒後にタイムアウトになります。ただし、送信してから19秒待ってから、19秒待ってから、19秒待って、...アイデアが浮かぶかもしれません。)"foo\n""f""o""o"

于 2012-07-18T15:09:29.260 に答える