iOS で、SO_RCVTIMEO を使用してタイムアウトが設定されたブロッキング ソケットを取得した場合。デバイスが接続されている WiFi ネットワークを変更すると、recv の呼び出しは適切にタイムアウトしますが、errno は EWOULDBLOCK として報告され、recv は -1 を返します。
これにより、デバイスが別のネットワークエンドポイントに接続されているため、この時点で現実的には不可能な場合に、外部処理ループがソケットに再度アクセスしようとします (現在利用可能なデータがないように見えるため)。
ネットワークを完全に強制終了すると、recv の呼び出しが何度も繰り返され、EWOULDBLOCK が何度も発生した後、最終的に ETIMEDOUT で失敗します。
なぜこれが起こるのですか?ソケット接続が壊れて、ENETRESET または同様の errno で失敗するべきではありませんか?
SO_RCVTIMEO がない場合、WiFi ネットワークが変更されると、ソケットは永久にブロックされます。ブエノもありません。
編集: ローカル ソケットで SO_KEEPALIVE を有効にして、基になるネットワーク エンドポイントが変更されたためにリモート ソケットが応答を停止したことを検出できると思います。これもうまくいかないようです。