AsyncSocket:合并两个数据包而不是单独的两个数据包

时间:2012-02-20 10:10:55

标签: objective-c ios sockets asyncsocket

我正在执行4个启动命令,并期望收到4个响应。服务器已经实现,另一个正在开发android的开发者能够接收这4个单独的响应,但是,我得到2个好的响应(单独),然后第3个和第4个响应作为一个响应。我将NSData的NSLog结果放在completeCurrentRead中,它输出合并的数据包“0106000000000b0600000000”而不是单独的数据包“010600000000”和“0b0600000000”。我也分别测试了第3和第4个命令(一次只测试一个),服务器一切正常,它们单独发送,但如果所有四个命令都在一行中执行,则会发生合并(第3和第4个) 。有什么想法吗?

更新:我认为我追溯到问题的根源。有一个调用在doBytesAvailable方法中从流中读取数据包数据:

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];

在readIntoBuffer:maxLength中,有一个调用(长度== 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);

因此,CFReadStreamRead返回不正确的数据包长度 - 它返回12(而不是6)的长度,并且还获取合并的数据。嗯,什么可能导致CFReadStreamRead将两个数据包读入一个,而不是单独读取...

UPDATE2:我正在使用onSocket:didReadData:withTag:委托方法,并期望接收带有我执行的请求标记的响应数据。我最近意识到,流是流,而不是数据包,但我怎么解决?服务器响应在响应的开始和结束时没有终止字符,只有响应大小,为2 - 5个字节。我可以删除响应的第一部分(第一个数据包)并忽略第二部分,但AsyncSocket如何使用响应的第二部分(第二个数据包)进行另一个回调?如果我只剪切第一部分然后忽略第二部分,那么恕我直言,第二部“数据包”将丢失......

如何剪切响应的第一部分并告诉AsyncSocket使用标记进行另一次回调,将响应的第二部分作为单独的回调?

UPDATE3:在onSocket:didReadData:withTag:中,我手动剪切合并的响应,处理第一部分(第一个数据包)然后在结束时,再次调用onSocket:didReadData:withTag:

if (isMergedPacket) {
  ...
 [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}

然而,看起来AsyncSocket本身使用标签将每个请求数据包与其响应数据包(通过AsyncReadPacket类)配对。所以,我的手动切割工作,但AsyncSocket不知道我已经处理了两个数据包,它仍然试图读取第二个数据包。所以,我得到了袜子:shouldTimeoutReadWithTag:...当读取操作达到超时而未完成时调用的回调。

1 个答案:

答案 0 :(得分:0)

找到解决方案。没有必要改变并深入研究AsyncSocket。您只需要定义每个响应的长度 - 您有多少字节是您有兴趣阅读和获得回调。您可以在其他帖子here

上找到更多信息