网上也有些例子,看了之后,通过自己的理解改改,就有了下面的代码。模拟银行查询余额系统。
头文件:
#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;
}