GCDAsyncSocket接收数据连包无法解析的问题
来源:互联网 发布:软件视频会议系统 编辑:程序博客网 时间:2024/06/06 04:46
最近在使用GCDAsyncSocket进行socket通信的工作,调试发现总是莫名的出现数据成功接收但是解析不成的情况,经分析发现一个可能性:
socket发送数据的时候会自动分包处理的,导致数据完整性验证失败。
未修复代码如下:
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ ITTDINFO(@"didReadData tag %ld", tag); [_responseData appendData:data]; if ([_responseData length] > 4 && [_responseParser validateData:_responseData]) { NSData *data = [_responseData copy]; [self parseData:data]; _responseData = [NSMutableData data]; [_asyncSocket readDataWithTimeout:READ_TIME_OUT tag:READ_TAG]; } else { [_asyncSocket readDataWithTimeout:READ_TIME_OUT tag:READ_TAG]; }}
备注:
接收到的数据头4个字节表示实体数据的长度
- (BOOL)validateData:(NSData*)responseData 验证接收到数据的完整性
这样写的问题明显问题是,缓存数据_responseData中可能存在一个完整的数据包和半个数据包,这样完整性验证肯定是失败,导致解析失败
修复后的代码如下:
- (NSData*)hasCompleteData{ NSData *completeData = nil; if ([_responseData length] > 4) { NSInteger lengthBytes = 4; NSInteger headLength = [_responseParser headLength:_responseData]; NSInteger leftLength = [_responseData length] - lengthBytes; if (leftLength >= headLength) { completeData = [_responseData subdataWithRange:NSMakeRange(0, headLength + lengthBytes)]; NSData *leftData = [_responseData subdataWithRange:NSMakeRange(headLength + lengthBytes, leftLength - headLength)]; _responseData = [[NSMutableData alloc] initWithData:leftData]; } } return completeData;}- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ ITTDINFO(@"didReadData tag %ld", tag); [_responseData appendData:data]; @synchronized(_responseData) { NSData *completeData = nil; while ((completeData = [self hasCompleteData])) { //一直从缓冲区里读获取完整的数据包,进行解析 [self parseData:data]; } [_asyncSocket readDataWithTimeout:READ_TIME_OUT tag:READ_TAG]; }}
0 0
- GCDAsyncSocket接收数据连包无法解析的问题
- GCDAsyncSocket接受数据丢包的问题
- GCDAsyncSocket 接收不到数据
- 解决swt桥连awt后鼠标滚轮事件(MouseEvent)无法接收的问题。
- send()的连包问题
- 解决VS2010使用mscomm控件无法接收数据的问题
- bootstrap table post提交数据,后台无法接收的问题
- Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包
- Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包
- Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包
- GSM模块无法接收数据问题
- 笔记本电脑无法连投影仪的问题
- 遇到一个在linux下无法跨网段发送接收广播包的问题
- GCDAsyncSocket不能读取数据的原因
- 关于json解析的无法接收报空指针的问题
- RTSP客户端接收H264的RTP包并解析遇到的问题
- GCDAsyncSocket类TCP连接发送数据粘包怎么办
- GCDAsyncSocket类TCP连接发送数据粘包怎么办
- 关于定位、浮动、z-index 和 offsetParent 的一些概念
- C语言中重复定义的问题
- 一款集阅读、听书以及搜书于一体的多功能阅读器
- JSP表单提交给Servlet处理后,转到重定向的页面时,布局混乱
- Android-Spinner的Listenner事件及菜单级联
- GCDAsyncSocket接收数据连包无法解析的问题
- NSFileManager和NSFileHandle
- cocos2d-x 3.0 回调事件
- BeagleBone的GPIO控制
- 整除的尾数 【杭电-2099】 附题
- python中的pass,del,exec,eval语句
- http://www.rottentomatoes.com/user/1076238/blogs/?id=787888: CML8129 8 travail Boot4 de Carhartt.
- http://louboutinvery.seesaa.net/article/402238518.html: la pêche
- http://louboutinavis.webpin.com/blog_350741_-de-Christian-Louboutin-et-le-transport-.html:FMI