• ベストアンサー

IO::Socketでacceptを実行すると待機状態になる

IO::Socketを使って、accept();を実行すると接続があるまでずっと待機状態になってしまいます。 調べたところ、これはaccept()の仕様だという事は分かったのですが、これをなんとかして一定時間たったらあきらめる。という風には出来ないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

alarmとevalによる方法 eval { local $SIG{ALRM} = sub { die "alarm!!\n" }; alarm 10; #10秒 eval { #時間のかかる処理 }; alarm 0; #取り消し }; alarm 0; die if $@ && $@ !~ /alarm!!/; #上記のメッセージの捕捉 #クックブックに載ってた方法です。

Justic
質問者

お礼

alarmとevalではそのように処理をするのですか。 もう既に別の方法で問題は解決してしまいましたが、 今後のプログラミングの参考にさせていただきます。 BLUEPIXYさん、親切な回答ありがとうございました。

その他の回答 (2)

  • omni2
  • ベストアンサー率53% (33/62)
回答No.2

よくわかりませんが、 $sock->accept(); の前に $sock->timeout(10);とか書けばよいのかもしれません・・ まちがってたらごめんなさい。。

Justic
質問者

お礼

omni2さん、osamuyさん、すばやい返事ありがとうございます。 2人が書いた内容で試してみようと思い、検索しなおしたところ意外な答えが見つかりました。 (単に自分の検索ワードがいけなかったみたいです。) $client_socket = new IO::Socket::INET ( PeerAddr => 'localhost', PeerPort => '80', Proto => 'tcp', TimeOut => '5'); この1番したの行のtimeout属性でaccept();の待機時間を決めれるそうです。 足らない質問に、ご迷惑をおかけいたしました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

selectを使ってタイムアウトさせるのが、王道と思われるので、IO::Selectを使ってみては。 Windowsだと、alarmとevalでタイムアウトさせる方が良いかもしれない。

参考URL:
http://www.perl.com/doc/manual/html/lib/IO/Select.html

関連するQ&A