• 締切済み

タイムアウト時ソケット通信を中断して次の処理を実行したい

だいぶはしょってありますが、大雑把な流れは下のようなサブルーチンです。 タイムアウト時エラーメッセージに飛んでしまうと、その後の&kaiseki_beta;が実行されません。 タイムアウト時にソケット通信を中断して、その後の処理を実行させたいのですが、方法がわかりません。 $SIG{'ALRM'} = \&closeSocket(SOCK);とかやってみたのですが、500エラーになってしまい困っています。 何か良い方法があったら教えてください。 sub autobeta { $SIG{'ALRM'} = \&TimeoutError; eval { alarm 10; }; if (&openSocket(SOCK, $url, $method, \%header, $stdin)) { $vieweron = 0; open(DATA,">$betafile"); while(<SOCK>) { if ($vieweron == 1) { print DATA $_; } if ($vieweron == 2) { $vieweron = 1; } if ($_ =~ /Content-Type/i) { $vieweron = 2; } } close(DATA); &closeSocket(SOCK); } else { &error; } eval { alarm 0; }; &kaiseki_beta; return($beta); }

みんなの回答

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.2

Webのアクセスは、LWPで簡単にできますから、生でゴリゴリ書きすぎないように して下さい。 ソケットを直に扱う場合は、 use IO::Socket; use IO::Select; してプログラムします。 my $readers = IO::Select->new(); $readers->add($sock); my @ready = $readers->can_read($timeOutSec); if (@ready) { # 読込み... } else { # タイムアウト発生 }

perl2006
質問者

お礼

LWPですか? 勉強不足でまったく知りませんでした。 もう一度調べてみます。 回答ありがとうございました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 ソケット通信のタイムアウトを捕捉するのであれば、select関数というものがあります。 http://flex.ee.uec.ac.jp/texi/perl/perl_68.html http://hp.vector.co.jp/authors/VA003991/kouza/senior/kouza_socker_perl.html このあたりで如何でしょうか?

perl2006
質問者

お礼

select関数でデータが来ているかどうかを確認してどうにかする、っていうことですね。 何か使えそうな気がしますが・・・ 考えてみます。 回答ありがとうございました。

関連するQ&A