GCDAsyncSocket を使用しているときに、書き込み操作にタイムアウトを設定しようとしています。コードは非常に単純で、次のとおりです。
[iAsyncSocket writeData:bytesToSend withTimeout:3.0 tag:0];
次に、Mac でインターネット接続を無効にし、書き込みタイムアウトが発生するのを待ちますが、何も起こりません。GCDAsyncSocketWriteTimeoutError
本来のエラーで切断されません。
また、インターネット接続をオフにした後、予想どおり、サーバーがメッセージの受信を停止することも検証しました。
ソース コードを調べたところ、書き込みタイムアウト イベントの発生を担当する writeTimer が常にキャンセルされる (関数endCurrentWrite
が呼び出される) ことがわかりました。タイマーがキャンセルされた場所までさかのぼると、次のコード行にたどり着きました。
ssize_t result = write(socketFD, buffer, (size_t)bytesToWrite);
write システム コールは、インターネット接続がなくてもソケットがデータを送信できたかのように、送信中の合計バイト数を常に返します。これは論理的ですか?
誰かが同じ問題を思いついた、または同様の動作を見たことがありますか? または、誰かが GCDAsyncSocket の書き込みタイムアウトを設定できましたか?
どうもありがとう。