Chinaunix首页 | 论坛 | 博客
  • 博客访问: 554415
  • 博文数量: 117
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 359
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 21:58
个人简介

爱上香烟

文章分类

全部博文(117)

文章存档

2018年(3)

2017年(8)

2016年(65)

2015年(41)

我的朋友

分类: C/C++

2016-04-12 10:01:09


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct {
  4.     char *buf;
  5.     int offset;
  6.        unsigned short type;
  7.     unsigned short len;
  8. }ControlMessag;
  9. int __expandMessage(ControlMessag *msg,int data_len);
  10. #define TYPE1 1
  11. #define TYPE2 2
  12. #define UNKNOWN_TYPE 3
  13. #define MessageMalloc(size) malloc(size)
  14. #define __DEBUG__
  15. #ifdef __DEBUG__
  16. #define DEBUG(format,...) printf("Fun: %s, Line: %d: "format"\n",__FUNCTION__, __LINE__, ##__VA_ARGS__)
  17. #else
  18. #define DEBUG(format,...)
  19. #endif

  20. void MessageFree(ControlMessag *msg){
  21.     if (msg->buf)
  22.         free(msg->buf);        
  23.     return;
  24. }
  25. #define expandMessage(msg,len)    {if( !__expandMessage(msg,len)) return 0;}
  26. int __expandMessage(ControlMessag *msg, int data_len){
  27.     DEBUG();
  28.     char *p = NULL;
  29.     int size = msg->offset + sizeof(msg->type) + sizeof(msg->len) + data_len;
  30.     p = (char *)MessageMalloc(size);
  31.     if (!p){
  32.         printf("FUNC=%s err \n",__FUNCTION__);
  33.         return 0;
  34.     }
  35.     memset(p, 0, size);
  36.     memcpy(p, msg->buf, msg->offset);
  37.     MessageFree(msg);
  38.     msg->buf = p;
  39.     return 1;
  40. }

  41. void msgStroeType(ControlMessag *msg, int val){
  42.     memcpy(&(msg->buf[msg->offset]), (char *)&val, sizeof(msg->type));
  43.     (msg->offset) += sizeof(msg->type);
  44. }
  45. void msgStroeLen(ControlMessag *msg, int val){
  46.     memcpy(&(msg->buf[msg->offset]), (char *)&val, sizeof(msg->len));
  47.     (msg->offset) += sizeof(msg->len);
  48. }
  49. int msgStoreData(ControlMessag *msg, void *data, int data_len){
  50.     if (!data)
  51.         return 0;
  52.     memcpy(&(msg->buf[msg->offset]), (char *)data, data_len);
  53.     (msg->offset) += data_len;
  54.     return 1;
  55. }
  56. int addElemMsg(ControlMessag *msg, int type, int len, void *data){
  57.     DEBUG();
  58.     if (len < 0 || (!data && len))
  59.         return 0;
  60.     expandMessage(msg, len);
  61.     msgStroeType(msg, type);
  62.     msgStroeLen(msg, len);
  63.     msgStoreData(msg, data, len);
  64.     return 1;
  65. }
  66. void parseMessage(ControlMessag *msg){
  67.     memcpy(&msg->type, &(msg->buf[msg->offset]), sizeof(msg->type));
  68.     (msg->offset) += sizeof(msg->type);
  69.     
  70.     memcpy(&msg->len, &(msg->buf[msg->offset]), sizeof(msg->len));
  71.     (msg->offset) += sizeof(msg->len);
  72.     return;
  73. }
  74. void showMsgData(ControlMessag *msg){
  75.     printf("this elem type=%d,len=%d,val=%.*s\n", msg->type, msg->len, msg->len, &msg->buf[msg->offset]);
  76. }
  77. int handleMessage(char *recvbuf, int recvbuf_size){
  78.     DEBUG("recvbuf_size =%d",recvbuf_size);
  79.     if (!recvbuf || !recvbuf_size)
  80.         return 0;
  81.     ControlMessag msg;
  82.     msg.buf = recvbuf;
  83.     msg.offset = 0;
  84.     int size = recvbuf_size;
  85.     while((size -= sizeof(msg.type)+sizeof(msg.len)) >= 0){
  86.         parseMessage(&msg);
  87.         if ((size -= msg.len) < 0){
  88.             printf(" size %d, this elem type=%d,len=%d, offset =%d \n", size , msg.type, msg.len, msg.offset);
  89.             return 0;
  90.         }            
  91.         switch (msg.type){
  92.             case TYPE1:
  93.                 //TODO:
  94.                 DEBUG(" type %d \n",msg.type);
  95.                 showMsgData(&msg);
  96.                 break;
  97.             case TYPE2:
  98.                 //TODO:
  99.                 DEBUG(" type %d \n",msg.type);
  100.                 showMsgData(&msg);
  101.                 break;                
  102.             default:
  103.                 DEBUG(" unrecognise this type %d \n",msg.type);
  104.         }        
  105.         msg.offset += msg.len;//jump data
  106.     }
  107.     return 1;
  108. }
  109. int main(){
  110.     ControlMessag msg;
  111.     memset(&msg, 0, sizeof(msg));
  112.     DEBUG();
  113.     addElemMsg(&msg, TYPE1, 2, "abc");
  114.     addElemMsg(&msg, TYPE2, 3, "abc");
  115.     addElemMsg(&msg, UNKNOWN_TYPE, 3, "abc");    
  116.     handleMessage(msg.buf,msg.offset);
  117.     return 1;
  118. }


阅读(1038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~