クライアント プログラム (c++) で、connect() API を使用してソケット経由でサーバー マシンに接続しようとしています。クライアント アプリケーションがブロックされた状態で待機しているシナリオを作成したいと考えています (つまり、長時間の後に ETIMEDOUT errno を返します)。しかし、connect() API は成功または失敗のみを返します。待っていません。ブロックされた状態で connect() API を待機させるにはどうすればよいですか。
3 に答える
ソケットを非ブロックに設定していない限り、実際にはブロックしていることになりconnect
ます。
タイムアウトをテストしたい場合は、サーバーのネットワーク ケーブルをしばらく抜いてください。
または、代わりに、自分のマシンのネットワーク ケーブルですが、これも名前解決を妨害し、その特定のconnect
.
これは前後逆に聞こえるかもしれませんが、ソケットをノンブロッキング モードにして、connect() を発行し、タイムアウトを指定して select() を呼び出します。select() がタイムアウトした場合は、接続タイムアウトがあります。ソケットがタイムアウト内に書き込み可能として選択された場合は、connect() を再度呼び出して接続を完了し、ソケットをブロッキング モードにして I/O を続行します。もちろん、すべてのステップでエラーをチェックしてください。
この手法を使用できるのは、約 1 分のデフォルトのタイムアウトを減らすためだけであり、増やすためではないことに注意してください。もちろん、すぐに接続が拒否された場合は、まったく待つ必要はありません。これを変更することはできません。
connect
の失敗を体験したい場合ETIMEDOUT
は、接続をリッスンするが絶対に受け入れない特別なサーバーを作成できます。クライアントがそのダミー サーバー プログラムに接続すると、遅かれ早かれタイムアウトになります。
もちろん、これはクライアントで作成したソケットが非ブロック化されていないことを前提としています。