【发布时间】:2010-07-27 13:16:47
【问题描述】:
这是Asynchronous IO with CFWriteStream 的同级问题。我正在使用 CFReadStreamScheduleWithRunLoop 和 CFReadSteamRead 来做异步 IO。我们如何通过阻塞安全地检索所有日期?
假设消息的实际大小为 1200(但我们不知道),而我的读取缓冲区大小为 1024。调用 CFReadStreamRead 将检索最多 1024 字节的数据,但由于我们不知道不知道消息的大小,我们应该反复调用 CFReadStreamRead。问题是,由于我们不知道流套接字接收了多少数据,CFReadStreamRead 可能会阻止第二次调用。我们怎样才能避免这个问题?
谢谢!
【问题讨论】:
-
明确一点:当我收到文档所述的 kCFStreamEventHasBytesAvailable 通知时,第一次调用 CFReadStreamRead 是安全的。但我们不知道 CFReadStreamRead 返回的原因是缓冲区不够大还是流套接字没有更多数据。如果在第一次通知之前已收到所有 1200 字节的数据,我们可能不会收到剩余数据的额外通知。所以我们应该对 CFReadStreamRead 进行第二次调用,并且不能保证第二次调用不会阻塞。假设正确吗?
标签: iphone cocoa networking network-programming