最近涉及到接收报文这一块,记录一点小经验。
一般来说:接收发送最简单的情况是这样的:
typedef struct MYMSG { unsigned int uX1; float fX2; char szX3[30]; bool bX4; }MyMsg,*PMyMsg; int main() { MyMsg msg; msg.uX1=100; msg.fX2=100.0; memcpy(msg.szX3,"abcd",30); msg.bX4=true; //cout << sizeof(msg) << endl;//40 //发送部分 char strSend[40];//strSend为发送的内容 memcpy(strSend,(char*)&msg,40); //接收部分 char strRecv[40]; memcpy(strRecv,strSend,40);//假设strSend即是接收的内容 MyMsg msgRecv; memcpy(&msgRecv,(MyMsg*)&strRecv,40); } 我的具体情况是发送方没有规定结构体,直接用char*按一定规则发送数据。我在接收的时候按那个规则构造了一个结构体,然后强转。如: if(msg != NULL && len <= sizeof(MyStruct)) { MyStruct* pData = (MyStruct*)msg; }这样就可以直接取值了。当然这是定长报文,结构体都很简单,如果出现了指针等变长成员还得慢慢解析。在构造结构体的时候在收尾加了两句话:
#pragma pack(push,1) MyStrcut{ }; #pragma pack(pop,1) #pragma pack是指定数据在内存中的对齐方式,如果不写这两句话,则结构体在编译时按默认方式对齐,即成员中size最大的那个,就可能出现一些空字节。当然里面也可以写出了1之外的其他数字。