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];

        

    }

     

  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/xiangjune/p/6179938.html
Copyright © 2011-2022 走看看