3

リモートサーバーのソケットに接続してリッスンするスクリプトがあります(現時点ではコード例はありませんが、IO::Asyncを使用しました)。クライアントは通常、新しいデータをリッスンするだけです。

問題は、ネットワークの問題が発生してソケット接続が失われたかどうかをクライアントが検出できないことです。私は IO::Async を使用し、IO::Socket でも試しました。最初の接続が確立された後、ハンドルは常に「接続」されます。

ネットワーク接続が再度確立された場合、スクリプトは再接続する必要があることを認識していないため、ソケット接続は当然失われます。

接続がまだそこにあるかどうかを確認するために、X秒ごとにソケットを「ping」(syswrite)するある種の「keepAlive」を作成することを考えていました(ソケットから新しいものがない場合)。

これは正しい方法ですか、それとも別のより創造的またはクリーンな解決策がありますか?

4

2 に答える 2

4

SO_KEEPALIVETCP の場合、定期的なキープアライブ メッセージを送信するソケット オプションを設定でき、この状態の検出に役立つ場合があります。これが検出された場合、EOF 状態が発生します (ほとんどの場合、包含IO::Async::Streamが発火しon_read_eofます)。

PINGより良い解決策として、IRC のコマンドなど、ある種のアプリケーション レベルのキープアライブ メッセージを検討することもできます。

于 2012-08-23T12:43:45.517 に答える
2

簡単に言えば、perl にはドロップされたソケットを自動的に検出するデフォルトの方法はありません。

ping のアプローチはおそらくかなりうまくいくでしょう。ping 要求を送信する連続スレッドをバックグラウンドで実行できます。応答を受信しない場合は、メイン スレッドに通知して再接続を発行する必要があります。

面倒なことをしたい場合は、 select() を使用して、キープアライブメッセージを検出できます。ただし、プラットフォームによっては、OS の設定が必要になる場合があります。

詳細については、このスレッドを参照してください: http://www.perlmonks.org/?node_id=566568

于 2012-08-23T12:45:14.817 に答える