以下是设置:
我有一个用CFReadStreamCreateForStreamedHTTPRequest
创建的输入流。它具有kCFStreamPropertyHTTPAttemptPersistentConnection
属性集(我正在汇集连接)。我正在连接的服务器使用分块编码返回数据。
在我们的正常情况下,一切都运作良好。我的问题是,如果有任何问题,我正在谈论的服务器会断开我的连接。对于我的生活,我无法弄清楚如何检测掉连接。
在我的流的事件回调中,我只看到kCFStreamEventEndEncountered
但是没有报告任何错误,即使在Wireshark中我可以清楚地看到连接在发送流末尾分块编码标记之前已经很久了。
当服务器断开连接时,我似乎应该收到kCFURLErrorNetworkConnectionLost
错误事件,但我只是遇到了最终结果。
任何建议都非常感谢。
答案 0 :(得分:3)
这需要一些挖掘,但事实证明,这实际上是CFNetwork的一个问题。我回到了10.4.10达尔文的来源,并在CFHTTPFilter.c
中找到了这条评论// Premature end of stream. However, some servers send simply CRLF for their last chunk instead of 0CRLF; be tolerant of this.
因此,如果在分块数据块之后成功读取CRLF并且没有更多连接,那么iOS和OS X中的内置HTTP块解码器似乎会认为丢弃的连接是有序的(并且不报告错误)缓冲区中未完成的字节。