goim socket丢包粘包问题解决。[转]

-(NSInteger)bytesToInt:(unsigned char*) data

{

    return (data[3]&255)|(data[2]&255)<<8|(data[1]&255)<<16|(data[0]&255)<<24;

}

 

-(NSInteger)parseDataLength:(NSData*)headerData

{

    unsigned char messageLength[4];

    [headerData getBytes:messageLength range:NSMakeRange(0, 4)];

    NSInteger messageDataLength = [self bytesToInt:messageLength];

    

    return messageDataLength;

}

 

//socket连接后收到数据

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)socketData withTag:(long)tag

{

    NSLog(@"socket连接后收到数据------------------------------------");

    

    switch (tag)

    {

        case TAG_PACKAGE_HEADER:

        {

            NSInteger messageDataLength = [self parseDataLength:socketData];

            if (messageDataLength == 0)

            {

                [_asyncSocket readDataToLength:TAG_PACKAGE_HEADER_LENGTH withTimeout:-1 tag:TAG_PACKAGE_HEADER];

            }

            else

            {

                [_asyncSocket readDataToLength:messageDataLength-4 withTimeout:-1 tag:TAG_PACKAGE_BODY];

            }

            break;

        }

        case TAG_PACKAGE_BODY:

        {

            [self parseSocketBodyData:socketData];

            

            [_asyncSocket readDataToLength:TAG_PACKAGE_HEADER_LENGTH withTimeout:-1 tag:TAG_PACKAGE_HEADER];

            

            break;

        }

        default:

//            [_asyncSocket readDataToLength:TAG_PACKAGE_HEADER_LENGTH withTimeout:-1 tag:TAG_PACKAGE_HEADER];

            break;

    }

    

    return;

    

}

 

 

-(void)parseSocketBodyData:(NSData *)socketData

{

    //从服务器发送的数据中减去前16字节的格式协议

    NSInteger dataLength = socketData.length;

    

    NSLog(@"data length = %ld", dataLength);

    

    Byte *inBuffer = malloc(MAX_BUFFER);

    inBuffer = (Byte *)[socketData bytes];

    BruteForceCoding *brute = [[BruteForceCoding alloc]init];

    Byte *resultByte = [brute tail:inBuffer anddataLengthLength:dataLength andHeaderLength:12];

    

    //解析指令,不同指令执行不同的操作

    NSInteger operation = [brute decodeIntBigEndian:inBuffer offset:4 size:4];

    

    //解析出body内容

    NSData *data = [NSData dataWithBytes:resultByte length:dataLength - 12];

    

    

    NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSDictionary *rspDic = [self dictionaryWithJsonString:string];

    

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值