MmCp 我的信息通讯控制协议 V1.0
/*
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/操作系统的字节顺序的差别
*/
- [font=新宋体]
- #ifndef USG_TYPE
- # define USG_TYPE
- typedef unsigned char USGC;
- typedef unsigned short USGS;
- typedef unsigned int USGI;
- typedef unsigned long USGL;
- #endif
- char gc_MmCp_HeadFlag[4] = {0x0D, 0x0D, 0x03, 0x10};
- char gc_MmCp_Ver1[2] = {0x01, 0x00};
- #ifndef MMCP_STRUCT_V1
- #define MMCP_STRUCT_V1 1
- struct MmCp_V1
- {
- char HeadFlag[4];
- char Ver[2];
- USGS MsgLen;
- USGL CRC32;
- char Resv[4];
- };
- #endif
- /* ------------------------------------------------------------------------- */
- int MmCp_Send(int sock, void *buf, int len_msg, int timeout_ms, int retry,
- int msg_code)
- /*
- 使用MmCp协议发送信息
- 参数:
- sock: socket handle
- buf: msg buffer to be sent
- len_msg: msg length
- timeout_ms: timeout msec
- retry: retry number
- msg_code: ASCII_CODE or EBCDIC_CODE
- Return: <0 --- error
- >=0 --- send msg len
- */
- {
- struct MmCp_V1 MCB; /* msg control block */
- int n_send = 0, rc;
- USGS MsgLen;
- USGL CRC32;
- MsgLen = len_msg;
- CRC32 = CalculateStringCRC32(buf, MsgLen);
- memmove(MCB.HeadFlag, gc_MmCp_HeadFlag, sizeof(gc_MmCp_HeadFlag));
- memmove(MCB.Ver, gc_MmCp_Ver1, sizeof(gc_MmCp_Ver1));
- MCB.MsgLen = htons(MsgLen);
- MCB.CRC32 = htonl(CRC32);
- rc = SendMsg(sock, (USGC *)&MCB, sizeof(MCB),
- timeout_ms, retry, msg_code, &n_send);
- if(rc != sizeof(MCB))
- return LogErrPos(rc, 0, __FILE__, __LINE__,
- "Send MCB=%d <> %d, n_send=%d",
- rc, sizeof(MCB), n_send);
- rc = SendMsg(sock, (USGC *)buf, len_msg,
- timeout_ms, retry, msg_code, &n_send);
- if(rc != len_msg)
- return LogErrPos(rc, 0, __FILE__, __LINE__,
- "SendMsg()=%d <> len_msg(%d), n_send=%d",
- rc, len_msg, n_send);
- return rc;
- }
- /* ------------------------------------------------------------------------- */
- int MmCp_Recv(int sock, void *buf, USGI max_len, int timeout_ms, int retry,
- int msg_code)
- /*
- 使用MmCp协议接收信息
- 参数:
- sock: socket handle
- buf: buffer for receive msg
- max_len: receive max length
- timeout_ms: timeout msec
- retry: retry number
- msg_code: ASCII_CODE or EBCDIC_CODE
- Return: <0 --- error
- >0 --- recv msg len
- =0 --- timeout
- */
- {
- struct MmCp_V1 MCB; /* msg control block */
- int n_recv = 0, rc;
- USGS MsgLen;
- USGL CRC32;
- rc = RecvMsg(sock, (USGC *)&MCB, sizeof(MCB), sizeof(MCB),
- timeout_ms, retry, msg_code, &n_recv);
- WrtLog("!!- %s, @MmCp_Recv: recv MCB rc=%d, n_recv=%dn", NOW(), rc, n_recv);
- if(rc == 0)
- return LogErrPos(GAE_SELECT_TIMEOUT, 0, __FILE__, __LINE__,
- "recv MCB timeout");
- if(rc < 0)
- return LogErrPos(rc, 0, __FILE__, __LINE__, "recv MCB error");
- if(rc != sizeof(MCB))
- return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
- "recv MCB rc <> %d", sizeof(MCB));
- if(memcmp(MCB.HeadFlag, gc_MmCp_HeadFlag, sizeof(gc_MmCp_HeadFlag)) != 0)
- return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__, "error MmCp_HeadFlag!");
- MsgLen = ntohs(MCB.MsgLen);
- CRC32 = ntohl(MCB.CRC32);
- if(MsgLen > max_len)
- return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
- "MsgLen(%d) > max_len(%d)!", MsgLen, max_len);
- rc = RecvMsg(sock, (USGC *)buf, MsgLen, MsgLen,
- timeout_ms, retry, msg_code, &n_recv);
- WrtLog("!!- %s, @MmCp_Recv: recv msg body, rc=%d, n_recv=%dn",
- NOW(), rc, n_recv);
- if(rc == 0)
- return LogErrPos(GAE_SELECT_TIMEOUT, 0, __FILE__, __LINE__,
- "recv msg body timeout");
- if(rc < 0)
- return LogErrPos(rc, 0, __FILE__, __LINE__, "recv msg body error");
- if(rc != MsgLen)
- return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__,
- "recv msg body rc <> MsgLen(%d)", MsgLen);
- if(CRC32 != CalculateStringCRC32(buf, MsgLen))
- return LogErrPos(GAE_RECV, 0, __FILE__, __LINE__, "CRC32 check error!");
- return rc;
- }[/font]
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
谢谢!
在32位机器没问题
在64位机器(HP-UX、AIX等)需要修改
你的结构体定义时没有对齐,有问题的。