您的位置:首页 > 运维架构 > Linux

linux 消息队列小例子

2012-11-30 11:21 369 查看
网上也有些例子,看了之后,通过自己的理解改改,就有了下面的代码。模拟银行查询余额系统。

头文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>

#define KEY_VALUE 0x888
#define MSG_TYPE1 123
#define MSG_TYPE2 456
#define MSG_LEN   100

static struct msgbuf
{
long mtype;           //正的消息类型
char acount;          //帐号
char name[MSG_LEN];   //帐户姓名
char balance[MSG_LEN];//帐户余额
}sndbuf, rcvbuf, *msgp;


服务器端代码:

#include "msg.h"

int main()
{
int rtrn, msqid;

if ( (msqid = msgget(KEY_VALUE, IPC_CREAT | 0660)) == -1)
{
perror("msgget ");
exit(-1);
}

while(1)
{
/* 接收客户端的消息 */
msgp = &rcvbuf;
printf("等待前台进程的请求....\n");
rtrn = msgrcv(msqid, msgp, sizeof(struct msgbuf), MSG_TYPE1, MSG_NOERROR);//MSG_NOERROR,若消息长度大于MSG_LEN,则截短多余的字节
if(rtrn == -1)
{
perror("msgrcv");
exit(-1);
}

/* 向客户端发送消息 */
msgp = &sndbuf;
msgp->mtype = MSG_TYPE2;
printf("\n请输入帐号%4.4s的帐户姓名:", &rcvbuf.acount);
scanf("%s", sndbuf.name);
printf("请输入该帐户余额 : ");
scanf("%s", sndbuf.balance);
rtrn = msgsnd(msqid, msgp, sizeof(struct msgbuf), 0);
if (rtrn == -1)
{
perror("msgsnd");
exit(-1);
}
}

return 0;
}


客户端代码:

#include "msg.h"

int main(int argc, char **argv)
{
int rtrn, msqid;

if ((msqid = msgget(KEY_VALUE, IPC_CREAT | 0660)) == -1)//创建一个消息队列,键值为KEY_VALUE,也可用ftok()也生成一个键值,用户和组可读写
{
perror("msgget ");
exit(-1);
}

/* 给服务器发送消息 */
msgp = &sndbuf;
msgp->mtype = MSG_TYPE1;
printf("输入4位帐号 : ");
scanf("%s", &sndbuf.acount);
rtrn = msgsnd(msqid, msgp, sizeof(struct msgbuf), 0);
if (rtrn == -1)
{
perror("msgsnd ");
exit(-1);
}

/* 接收服务器的消息 */
msgp = &rcvbuf;
printf("等待后台数据处理进程的回答....\n");
rtrn = msgrcv(msqid, msgp, sizeof(struct msgbuf), MSG_TYPE2, 0);
if(rtrn == -1)
{
perror("msgrcv ");
exit(-1);
}

printf("\n姓名 : %s\n", rcvbuf.name);
printf("余额 : %s\n", rcvbuf.balance);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: