1

GCDAsyncSocket を使用しているときに、書き込み操作にタイムアウトを設定しようとしています。コードは非常に単純で、次のとおりです。

[iAsyncSocket writeData:bytesToSend withTimeout:3.0 tag:0];

次に、Mac でインターネット接続を無効にし、書き込みタイムアウトが発生するのを待ちますが、何も起こりません。GCDAsyncSocketWriteTimeoutError本来のエラーで切断されません。

また、インターネット接続をオフにした後、予想どおり、サーバーがメッセージの受信を停止することも検証しました。

ソース コードを調べたところ、書き込みタイムアウト イベントの発生を担当する writeTimer が常にキャンセルされる (関数endCurrentWriteが呼び出される) ことがわかりました。タイマーがキャンセルされた場所までさかのぼると、次のコード行にたどり着きました。

ssize_t result = write(socketFD, buffer, (size_t)bytesToWrite);

write システム コールは、インターネット接続がなくてもソケットがデータを送信できたかのように、送信中の合計バイト数を常に返します。これは論理的ですか?

誰かが同じ問題を思いついた、または同様の動作を見たことがありますか? または、誰かが GCDAsyncSocket の書き込みタイムアウトを設定できましたか?

どうもありがとう。

4

0 に答える 0