2

Ubuntu Linux、2.6.32-45 カーネル、64b、Perl 5.10.1

多くの新しい IO::Socket::UNIX ストリーム ソケットをサーバーに接続しましたが、ほとんどの場合、正常に動作します。ただし、より高速なプロセッサでスレッド化された環境では、「リソースが一時的に利用できません」(EAGAIN/EWOULDBLOCK) が返されることがあります。Connect でタイムアウトを使用しているため、接続中にソケットが非ブロック モードになります。しかし、私のタイムアウト期間は発生していません-目立った時間は待たず、すぐに戻ります。

IO::Socket 内で接続を試行し、EINPROGRESS または EAGAIN/EWOULDBLOCK で失敗した場合は、書き込みビットが設定されるのを待つために選択を行うことがわかります。これまでのところ、これは正常なようです。私の場合、選択はすぐに成功し、書き込みビットが設定されていることを意味し、コードは再接続を試みます。(これは、エラー スリッページによって何らかのエラーを取得しようとする試みなのでしょうか?) とにかく、再接続は EAGAIN/EWOULDBLOCK で再び失敗します。

私のコードでは、これは再試行ループで簡単に修正できます。しかし、ソケットが書き込み可能になると、ソケットが再接続できない理由がわかりません。非ブロッキング接続には常にセレクトガードで十分だと思いました。どうやらそうではありません。私の質問は次のとおりです。

  • 選択が機能する (書き込みビットが設定される) ときに接続が失敗する原因は何ですか?
  • 接続が成功するのを待つために、スピンして再試行するよりも良い方法はありますか? 回転は無駄なサイクルです。代わりに、選択/ポーリングなどでブロックしたいのですが、それでもタイムアウトが必要です。

ありがとう、

-- スティーブ

4

1 に答える 1

0

しかし、ソケットが書き込み可能になると、ソケットが再接続できない理由がわかりません。

必要なリソースが解放されて、再び接続できるようになる前に奪われたためだと思います。をスピンループに置き換えても、selectそれは役に立ちません。

于 2012-12-03T19:39:40.760 に答える