zoukankan      html  css  js  c++  java
  • 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];

        

    }

     

  • 相关阅读:
    JS获当前网页元素高度offsetHeight
    C-LODOP回调多个返回值On_Return_Remain
    JS的slice、substring、substr字符串截取
    【JS新手教程】JS修改css样式的几种方法
    Unity GUI(uGUI)使用心得与性能总结
    PDB文件:每个开发人员都必须知道的
    IEnumerable 使用foreach 详解
    Unity------Unity 脚本基类 MonoBehaviour 与 GameObject 的关系
    Unity5-----------之GI设置简介
    unity5x --------Music Mixer参数详解
  • 原文地址:https://www.cnblogs.com/xiangjune/p/6179938.html
Copyright © 2011-2022 走看看