免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2701 | 回复: 2

MmCp 我的信息通讯控制协议 V1.0 [复制链接]

论坛徽章:
0
发表于 2009-09-28 11:15 |显示全部楼层
/*
MmCp 我的信息通讯控制协议 V1.0
一、目的:作为低层的信息传输控制协议,保证信息传输的完整性和不被篡改
二、结构:
1、4字节HEAD FLAG:0x0D, 0x0D, 0x03, 0x10(即Ctrl+"MMCP"的ASCII码)
2、2字节版本:0x01,0x00(表示V01.00)(也可用一字节作为加密的key index)
3、2字节信息长度(下面第6部分信息块的长度):网络顺序,
   可用htons(),ntohs()处理
4、4字节CRC32(下面第6部分的CRC32):网络顺序,
   可用htonl(),ntohl()处理
5、4字节保留:目前填0x00000000(也可以保存前面CRC32的加密结果)
6、N字节信息块:1<=N<=0xFFFF
使用网络顺序是为了保证在异构机器通讯的时候可以用同一段程序,
不必关心它们CPU/操作系统的字节顺序的差别
*/


  1. [font=新宋体]
  2. #ifndef  USG_TYPE
  3. # define USG_TYPE
  4.   typedef unsigned char  USGC;
  5.   typedef unsigned short USGS;
  6.   typedef unsigned int   USGI;
  7.   typedef unsigned long  USGL;
  8. #endif

  9. char gc_MmCp_HeadFlag[4] = {0x0D, 0x0D, 0x03, 0x10};
  10. char gc_MmCp_Ver1[2] = {0x01, 0x00};

  11. #ifndef MMCP_STRUCT_V1
  12. #define MMCP_STRUCT_V1          1
  13. struct MmCp_V1
  14. {
  15.   char HeadFlag[4];
  16.   char Ver[2];
  17.   USGS MsgLen;
  18.   USGL CRC32;
  19.   char Resv[4];
  20. };
  21. #endif


  22. /* ------------------------------------------------------------------------- */
  23. int  MmCp_Send(int sock, void *buf, int len_msg, int timeout_ms, int retry,
  24.                int msg_code)
  25. /*
  26.    使用MmCp协议发送信息

  27.    参数:
  28.    sock: socket handle
  29.    buf: msg buffer to be sent
  30.    len_msg: msg length
  31.    timeout_ms: timeout msec
  32.    retry: retry number
  33.    msg_code: ASCII_CODE or EBCDIC_CODE

  34.    Return: <0  --- error
  35.            >=0 --- send msg len
  36. */
  37. {
  38.   struct MmCp_V1 MCB; /* msg control block */
  39.   int  n_send = 0, rc;
  40.   USGS MsgLen;
  41.   USGL CRC32;

  42.   MsgLen = len_msg;
  43.   CRC32 = CalculateStringCRC32(buf, MsgLen);
  44.   memmove(MCB.HeadFlag, gc_MmCp_HeadFlag, sizeof(gc_MmCp_HeadFlag));
  45.   memmove(MCB.Ver, gc_MmCp_Ver1, sizeof(gc_MmCp_Ver1));
  46.   MCB.MsgLen = htons(MsgLen);
  47.   MCB.CRC32 = htonl(CRC32);

  48.   rc = SendMsg(sock, (USGC *)&MCB, sizeof(MCB),
  49.                timeout_ms, retry, msg_code, &n_send);
  50.   if(rc != sizeof(MCB))
  51.     return LogErrPos(rc, 0, __FILE__, __LINE__,
  52.                      "Send MCB=%d <> %d, n_send=%d",
  53.                      rc, sizeof(MCB), n_send);
  54.   rc = SendMsg(sock, (USGC *)buf, len_msg,
  55.                timeout_ms, retry, msg_code, &n_send);
  56.   if(rc != len_msg)
  57.     return LogErrPos(rc, 0, __FILE__, __LINE__,
  58.                      "SendMsg()=%d <> len_msg(%d), n_send=%d",
  59.                      rc, len_msg, n_send);
  60.   return rc;
  61. }

  62. /* ------------------------------------------------------------------------- */
  63. int  MmCp_Recv(int sock, void *buf, USGI max_len, int timeout_ms, int retry,
  64.                int msg_code)
  65. /*
  66.    使用MmCp协议接收信息

  67.    参数:
  68.    sock: socket handle
  69.    buf: buffer for receive msg
  70.    max_len: receive max length
  71.    timeout_ms: timeout msec
  72.    retry: retry number
  73.    msg_code: ASCII_CODE or EBCDIC_CODE

  74.    Return: <0 --- error
  75.            >0 --- recv msg len
  76.            =0 --- timeout
  77. */
  78. {
  79.   struct MmCp_V1 MCB; /* msg control block */
  80.   int  n_recv = 0, rc;
  81.   USGS MsgLen;
  82.   USGL CRC32;

  83.   rc = RecvMsg(sock, (USGC *)&MCB, sizeof(MCB), sizeof(MCB),
  84.                timeout_ms, retry, msg_code, &n_recv);
  85.   WrtLog("!!- %s, @MmCp_Recv: recv MCB rc=%d, n_recv=%d\n", NOW(), rc, n_recv);
  86.   if(rc == 0)
  87.     return LogErrPos(GAE_SELECT_TIMEOUT, 0, __FILE__, __LINE__,
  88.                      "recv MCB timeout");
  89.   if(rc < 0)
  90.     return LogErrPos(rc, 0, __FILE__, __LINE__, "recv MCB error");
  91.   if(rc != sizeof(MCB))
  92.     return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
  93.                      "recv MCB rc <> %d", sizeof(MCB));
  94.   if(memcmp(MCB.HeadFlag, gc_MmCp_HeadFlag, sizeof(gc_MmCp_HeadFlag)) != 0)
  95.     return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__, "error MmCp_HeadFlag!");
  96.   MsgLen = ntohs(MCB.MsgLen);
  97.   CRC32 = ntohl(MCB.CRC32);
  98.   if(MsgLen > max_len)
  99.     return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
  100.                      "MsgLen(%d) > max_len(%d)!", MsgLen, max_len);

  101.   rc = RecvMsg(sock, (USGC *)buf, MsgLen, MsgLen,
  102.                timeout_ms, retry, msg_code, &n_recv);
  103.   WrtLog("!!- %s, @MmCp_Recv: recv msg body, rc=%d, n_recv=%d\n",
  104.          NOW(), rc, n_recv);
  105.   if(rc == 0)
  106.     return LogErrPos(GAE_SELECT_TIMEOUT, 0, __FILE__, __LINE__,
  107.                      "recv msg body timeout");
  108.   if(rc < 0)
  109.     return LogErrPos(rc, 0, __FILE__, __LINE__, "recv msg body error");
  110.   if(rc != MsgLen)
  111.     return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
  112.                      "recv msg body rc <> MsgLen(%d)", MsgLen);
  113.   if(CRC32 != CalculateStringCRC32(buf, MsgLen))
  114.     return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__, "CRC32 check error!");
  115.   return rc;
  116. }[/font]
复制代码

论坛徽章:
0
发表于 2009-09-28 23:47 |显示全部楼层
你的结构体定义时没有对齐,有问题的。

论坛徽章:
0
发表于 2009-11-12 10:52 |显示全部楼层
谢谢!
在32位机器没问题
在64位机器(HP-UX、AIX等)需要修改
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP