예제 #1
0
int DetailWorker::serial(net_head_t* head, char* message, char zip)
{
    head->size = 0;
    uint32_t nBufSize = _message.ByteSize();

    do {
        if(zip == 'Z') {
            char szBuf[nBufSize + 1];
            int ret = _message.SerializeToArray(szBuf, nBufSize);
            if(ret == 0) {
                break;
            }
            uLong nComprSize = compressBound(nBufSize) + 1;
            if(nComprSize >= DEFAULT_MESSAGE_SIZE - sizeof(net_head_t)) {
                break;
            }
            ret = zcompress((Bytef *)(message+sizeof(net_head_t)), &nComprSize, (Bytef *)szBuf, nBufSize);
            if(ret != 0) {
                break;
            }
            head->cmpr = 'Z';
            head->size = nComprSize;
        } else {
            if(nBufSize >= DEFAULT_MESSAGE_SIZE - sizeof(net_head_t)) {
                break;
            }
            int ret = _message.SerializeToArray(message+sizeof(net_head_t), nBufSize);
            if(ret == 0) {
                break;
            }
            head->cmpr = 'N';
            head->size = nBufSize;
        }
    } while(0);

    *(net_head_t*)message = *head;
    head->size += sizeof(net_head_t);
    return head->size;
}
예제 #2
0
파일: t.c 프로젝트: dulton/solotools
int process_keda_one_protocol(char **pOneProto, u32 *len_one_proto)
{
    puts("----------- ONE PROTOCOL ---------------");
    t_disbuf(*pOneProto, *len_one_proto);
    puts("-- -- -- -- -- -- -- -- -- -- -- -- -- -- --");
    //const static char FLG_COMP[] = "\x02\x23";
    u16 inet_len_msg_compress = 0;
    //u16 host_len_msg_compress = 0;
    u16 len_msg_uncompress = 0;
    unsigned long host_len_msg_compress_l = 0;
    unsigned long len_msg_uncompress_l = 0;
    unsigned char *pUncompress = NULL;
    unsigned char *ptr = NULL;
    //puts("process_keda_one_protocol: 1");
    //if (memcmp(*pOneProto + 18, FLG_COMP, sizeof(FLG_COMP)-1) != 0)
        //return 1;
    //puts("process_keda_one_protocol: 2");
    memcpy(&inet_len_msg_compress, *pOneProto + OFFSET_LEN_MSG, 2);
    host_len_msg_compress_l = ntohs(inet_len_msg_compress) - 4;
    //puts("process_keda_one_protocol: 3");
    //inet_len_msg_compress = htons(ntohs(inet_len_msg_compress) - 4);
    //len_msg_compress_l = ntohs(inet_len_msg_compress) - 4;
    memcpy(&len_msg_uncompress, *pOneProto + 41, 2);
    len_msg_uncompress_l = len_msg_uncompress;
    //printf("len_msg_uncompress:%d\n", len_msg_uncompress);

    //puts("process_keda_one_protocol: 4");
    if (oss_malloc(&pUncompress, len_msg_uncompress) < 0)
    {
        logerr_out("malloc uncompress memory failed!");
        return -1;
    }

    //puts("process_keda_one_protocol: 5");
    ptr = (unsigned char*)(*pOneProto + LEN_PROTO_HEAD + 4);
    //puts("--------- before uncompress -----------");
    //t_disbuf(ptr, len_msg_compress_l);
	if (zdecompress(ptr,host_len_msg_compress_l, pUncompress, &len_msg_uncompress_l) < 0)
    {
        oss_free(&pUncompress);
        puts("-------------------------------------------------");
        t_disbuf(ptr, host_len_msg_compress_l);
        logerr_out("uncompress failed!");
        return 1;
    }

    //puts("process_keda_one_protocol: 6");
    //printf("uncompress len:%ld\n", len_msg_uncompress_l);
    //puts("-------- uncompress ----------------------------------------");
    t_disbuf(pUncompress, len_msg_uncompress_l);

    //if (process_keda_uncompress(put, &pUncompress, &len_msg_uncompress) < 0)
    //{
        //oss_free(&pUncompress);
        //logerr_out("process keda uncompress failed!");
        //return -1;
    //}

    //puts("process_keda_one_protocol: 7");
    // ReCompress
    unsigned char *pNewCompress = NULL;
    unsigned long len_new_compress = len_msg_uncompress + 128; // sometimes compress data is larger than that uncompress.
    if (oss_malloc(&pNewCompress, len_new_compress) < 0)
    {
        logerr_fmt("malloc failed! size:%lu", len_new_compress);
        return -1;
    }
    if (zcompress(pUncompress,len_msg_uncompress_l, pNewCompress,&len_new_compress) < 0)
    {
        printf("pUn:%p, len_un:%lu, pNew:%p, len_new:%lu\n", pUncompress, len_msg_uncompress_l, pNewCompress,len_new_compress);
        oss_free(&pUncompress);
        oss_free(&pNewCompress);
        logerr_out("compress failed!");
        exit(-1);
        return -1;
    }
    //puts("process_keda_one_protocol: 8");
    //puts("------------ new compress ----------------------------");
    //t_disbuf(pNewCompress, len_new_compress);

    // update data
    if ((ptr = (unsigned char*)realloc(*pOneProto, LEN_PROTO_HEAD + 4 + len_new_compress)) == NULL)
    {
        oss_free(&pUncompress);
        oss_free(&pNewCompress);
        logerr_out("realloc failed!");
        return -1;
    }
    //puts("process_keda_one_protocol: 9");
    *pOneProto= (char*)ptr;
    *len_one_proto = LEN_PROTO_HEAD + 4 + len_new_compress;

    memcpy(*pOneProto + LEN_PROTO_HEAD + 4, pNewCompress, len_new_compress);
    len_new_compress += 4;
    u16 inet_len_new_compress = htons(len_new_compress);
    memcpy(*pOneProto + 20, &inet_len_new_compress, 2);

    //puts("process_keda_one_protocol: 10");
    //puts("-------- new data -----------");
    //t_disbuf((unsigned char*)*ut_buf, *pack_len);
    
    oss_free(&pUncompress);
    oss_free(&pNewCompress);

    //puts("process_keda_one_protocol: 11");
    return 1;
}