socket(8):socket 消息处理工程示例
1. 大型工程socket消息处理大致模板
以 HELLO进程间消息通信的工程为例来简要说明在socket中处理消息的,其他工程类似。
2.消息类型
typedef struct tagHELLO_MSG_TYPE
{
HELLO_MSG_TYPE_SEND = 0; //发送hello 消息
HELLO_MSG_TYPE_RPINT; //打印hello 消息
//…………其他消息
HELLO_MSG_TYPE_MAX; //最大消息
}HELLO_MSG_TYPE_S
3.消息头
typedef struct tagHELLO_MSGHEAD
{
int iMsgType;//消息类型,是消息类型中的消息
}HELLO_MSG_HEAD_S;
4. 具体的消息
具体要做的事情,或者说要发送的数据,这里举例子
typedef struct tagHELLO_MSG
{
int iMsgNum; //消息代号
char* pContent;//具体的消息内容等
//…… ……其他数据
}HELLO_MSG_S;
5.进程1 发送消息给 进程2
char* pcBuf = NULL; //发送给进程2的消息 buf
…… ……
//一系列处理
//malloc pcBuf;
//memset pcBuf;
…… ……
//消息初始化阶段
HELLO_MSG_S * pHelloMsg = NULL;
//填充消息
pHelloMsg->iMsgNum = 123;
pHelloMsg->pContent = "Hello world";
HELLO_MSG_HEAD_S stHelloMsgHead;
memset(stHelloMsgHead, 0, sizeof(stHelloMsgHead));
设置此次发送的消息类型,然后把消息头塞进 buf pcBuf 中
stHelloMsgHead.iMsgType = htons(int)HELLO_MSG_TYPE_SEND; //记得转序
memcpy(pcBuf, &stHelloMsgHead, sizeof(HELLO_MSG_HEAD_S)); //塞消息头到 pcBuf 初始位置
pcBuf 往后偏移消息头的大小,塞具体的消息数据内容
memcpy(pcBuf + sizeof(HELLO_MSG_HEAD_S), pHelloMsg, sizeof(HELLO_MSG_S));
6.线程2 接收并处理线程1 的消息
HELLO_MSG_S * pHelloMsg2 = NULL;
//将 pcBuf 转成消息头进行检查
HELLO_MSG_HEAD_S* pHelloMsgHead;
pHelloMsgHead = (HELLO_MSG_HEAD_S)(void *)pcBuf;
获取消息类型
iMsgType = pHelloMsgHead->iMsgType;
判断消息类型是否合法
if( HELLO_MSG_TYPE_MAX <= iMsgType)
{
return error;
}
获取消息,处理消息
switch(iMsgType)
{
case HELLO_MSG_TYPE_SEND:
{
//将具体消息取出来 进行处理
pHelloMsg2 = (HELLO_MSG_S *)(void *)(pcBuf + sizeof(HELLO_MSG_HEAD_S));
//处理函数
printf("Msg Num = %d, MsgContent = %s\r\n",
pHelloMsg2->iMsgNum, pHelloMsg2->pContent);
break;
}
case HELLO_MSG_TYPE_RPINT:
{
//同上
printf("RPINT HELLO\r\n");
//处理函数
break;
}
…… ……
default:
{
break;
}
}