が表示される理由として、次の 3 つが考えられETIMEDOUT
ます。
- 内部で接続がタイムアウトしました
recv
。これが 1 回も発生する可能性はほとんどありません (ただし、複数回発生することはありません)。
- の成功をチェックしなかったため
connect
、接続が正常に確立されませんでした (ファイアウォールが接続試行を破棄している可能性があります)。これが考えられる理由です。
- ソケットの実装が壊れています。これはほとんどありません。
select
生成しませんETIMEDOUT
、のみconnect
、および recv
可能性があります。まれに、受信するものが何もないときに準備完了を報告することがselect
ありますが (古い Linux カーネルでは、これはおそらく修正されています)、この場合に発生する唯一のことはrecv
ブロッキングです。
recv
このエラーが発生する可能性がありますが、確立された接続がタイムアウトになる可能性はほとんどありません。ケーブルを引っ張らない場合、または nos が指摘したように、NAT ゲートウェイが何もしないで数分後にタイムアウトする可能性があります。接続が確立できた場合、ルートがあり、誰かが相手側でリッスンしているため、通常、タイムアウトの通常の理由はありません (もちろん、常に発生する可能性はありませんが、タイムアウトが発生する可能性はあります)。もちろん、このエラーは、接続が何らかの理由で (ブロックに関係なく) 本当にタイムアウトした場合に最終的に発生しますが、どちらかといえば、通常の状態ではなく、非常に例外的な状態です。
connect
失敗は、おそらくさまざまな理由 (到達できない、ファイアウォール、サーバー プロセスが実行されていないなど) によって発生する可能性がある状態であり、それを引き起こす状態である限り、試行するたびに定期的に発生するものです。持続します。
の後にデータを完全に受信するための回避策ETIMEDOUT
はありません。read
バッファにあるもの(関数呼び出しで指定した最大値まで)を提供するか、ブロックするか、失敗します。これら3つのことのうちの1つで、他には何もありません。
失敗すると、失敗する前に利用できたものはすべてあります (あなたの側で読み取るものは何もありません)。接続は失われます。つまり、ソケットは使用できなくなります。
できることは、新しいソケットを作成して新しい接続を確立し、再試行することだけです。