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

        

    }

     

  • 相关阅读:
    POJ 2891 Strange Way to Express Integers 中国剩余定理解法
    @Repository @Service 和@Autowired 的使用
    POJ 3070 Fibonacci
    无线局域网技术
    第一次ACM赛后总结及感悟
    Subsets II -- LeetCode
    [WebView学习之二]:使用Web Apps 支持不同分辨率屏
    微信公众平台开发新手教程(图文具体解释)
    翻译-In-Stream Big Data Processing 流式大数据处理
    Nginx + FastCgi + Spawn-fcgi + C 架构的server环境搭建
  • 原文地址:https://www.cnblogs.com/xiangjune/p/6179938.html
Copyright © 2011-2022 走看看