MmCp 我的信息通讯控制协议 V1.0

发布于 2022-08-22 15:18:57 字数 7802 浏览 9 评论 2

/*
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=%dn", 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=%dn",
  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]

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱她像谁 2022-08-28 10:38:03

谢谢!
在32位机器没问题
在64位机器(HP-UX、AIX等)需要修改

梦里泪两行 2022-08-27 13:27:12

你的结构体定义时没有对齐,有问题的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文