2

asio を使用した非同期 TCP/IP クライアントがあります。接続が失われると、async_read のハンドル関数がエラーを受け取ります。そのため、接続が失われたことが通知されます。

現在、同期 TCP/IP クライアントを実装するいくつかのレガシー コードをリファクタリングしています。ここでは、抽象インターフェイスがこのシーケンス (同期書き込み、同期読み取り) を強制します。asioでそれを行うのはかなり簡単ですが、接続が失われた場合は非同期で知りたいです。

よりエレガントな方法はありますか:

オプション A: ソケットがまだ生きているかどうかをチェックするスレッドを追加します (読み取りを試みることによって... しかし、読み取りが同期読み取りからデータを盗まないことをどのように確認できますか? Boost asio ip tcp iostream Error Detectionを参照してください)

オプション B: 代わりに async_read を使用し、同期読み取りをエミュレートする

4

1 に答える 1

2

同期操作は、非同期操作と同じように失敗すると思います。ただし、同期が失敗すると、タイムアウトが非常に長くなり、他のすべてが待機する必要がある場合にはるかに目立つ可能性があるため、より混乱する可能性があります。

ソケットで TCP キープアライブを有効にすることを検討し、場合によっては TCP キープアライブ間隔を短くして、切断された接続をより早く検出することをお勧めします。

于 2012-04-05T22:40:13.773 に答える