CFReadStreamRead 读取时如何区分数据包?

Posted

技术标签:

【中文标题】CFReadStreamRead 读取时如何区分数据包?【英文标题】:How CFReadStreamRead distinguishes packets when reading? 【发布时间】:2012-02-20 14:38:29 【问题描述】:

我觉得我缺少一些基本信息,但是,我面临的问题是我得到一个数据包,其中包含两个合并的其他数据包。服务器 API 工作正常,此合并仅在同时发生多个写入和读取时发生。那么,问题是如果服务器通过套接字执行多次写入,谁负责区分数据包从哪里开始、结束以及第二个数据包从哪里开始?我还是 CFReadStreamRead?

目前,我正在使用 AsyncSocket ,它是 CFNetwork 的包装器,但恕我直言,问题与 CFReadStreamRead 本身有关:有时它将两个数据包作为一个数据包读取,而不是单独读取它们。当多个写入和读取同时发生时,我无法找到有关流如何进行的相关示例和信息,我是否需要明确地做一些事情来抓取数据包,或者我是否需要手动将这些数据包从即将到来的数据流中分离出来?虽然 CFReadStreamRead 已经做到了,但也许我错过了。

【问题讨论】:

【参考方案1】:

不清楚您在这里所说的“数据包”是什么意思,我怀疑您对这个词的使用非常松散。确定数据包(即 IP 数据包)边界的位置是在网络层,它远低于您所说的任何东西。

在您所说的层上,所有写入都将连接在一起。字节就是字节。单次写入绝不意味着单次读取。多次写入可以映射到一次读取,反之亦然。由协议来指示协议认为是单独消息的事物之间的边界在哪里。在您描述的情况下,这意味着这是您和您的服务器之间的问题。

【讨论】:

谢谢,答案片段“多次写入可能映射到一次读取,反之亦然”很好地回答了我的问题:) 因为早些时候,我虽然一次写入将映射到一次读取。将开始进一步挖掘,因为我的第一个问题是,AsyncSocket 是否正常返回一个 NSData 数据包而不是两个:***.com/questions/9359391/… 是的,AsyncSocket 的行为与此处设计的一样。

以上是关于CFReadStreamRead 读取时如何区分数据包?的主要内容,如果未能解决你的问题,请参考以下文章

excel 列数大于Z时如何使用PHP程序读取

Regex表达式中如何区分十六进制数和十进制数?

使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?

如何在 iOS 中读取、写入和检查不区分大小写的文件名?

如何区分指令与数据?

java 文件流 输入流 输出流