1

セットアップは次のとおりです。

で作成された入力ストリームがありCFReadStreamCreateForStreamedHTTPRequestます。プロパティセットがありkCFStreamPropertyHTTPAttemptPersistentConnectionます(接続をプールしています)。接続しているサーバーは、チャンク エンコーディングでデータを返しています。

通常のケースでは、すべてがうまく機能します。私の問題は、問題がある場合、話しているサーバーが接続を切断することです。私の人生では、切断された接続を検出する方法がわかりません。

私のストリームのイベント コールバックではkCFStreamEventEndEncountered、エラーは報告されていませんが、Wireshark では、ストリームの終わりのチャンク エンコーディング マーカーが送信されるずっと前に、接続が FIN になっていることがはっきりとわかります。

kCFURLErrorNetworkConnectionLostサーバーが接続を切断したときにエラーイベントが発生するはずですが、最後に遭遇しただけです。

どんな提案でも大歓迎です。

4

1 に答える 1

3

かなり掘り下げましたが、これは実際には CFNetwork の問題であることが判明しました。10.4.10 Darwin ソースに戻って、CFHTTPFilter.c でこのコメントを見つけました。

// Premature end of stream.  However, some servers send simply CRLF for their last chunk instead of 0CRLF; be tolerant of this.

したがって、iOS および OS X の組み込み HTTP チャンク デコーダーは、チャンク データ ブロックの後に CRLF を正常に読み取り、未処理のバイトがなくなった場合、切断された接続を正常であると見なします (エラーを報告しません)。バッファ。

于 2012-06-13T22:11:00.247 に答える