资源描述:
《消息队列通信实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验6消息队列通信实验目的1、了解什么是消息、消息队列2、掌握消息传送的机理实验内容1、消息的创建、发送和接收。使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为1k的消息发送和接收的程序。Msgqid.c#include#include#include#include#defineMSGKEY75/*定义关键词MEGKEY*/structmsgform/*消息结构*/{longmtype;charmtex
2、t[1030];/*文本长度*/}msg;intmsgqid,i;voidCLIENT(){inti;msgqid=msgget(MSGKEY,0777);for(i=10;i>=1;i--){msg.mtype=i;printf("(client)sent");msgsnd(msgqid,&msg,1024,0);/*发送消息msg入msgid消息队列*/}exit(0);}voidSERVER(){msgqid=msgget(MSGKEY,0777
3、IPC_CREAT);/*由关键字获得消息队列*/do{msgrcv(msgqid
4、,&msg,1030,0,0);/*从msgqid队列接收消息msg*/printf("(server)received");}while(msg.mtype!=1);/*消息类型为1时,释放队列*/msgctl(msgqid,IPC_RMID,0);exit(0);}main(){while((i=fork())==-1);if(!i)SERVER();while((i=fork())==-1);if(!i)CLIENT();wait(0);wait(0);}实验结果:2、选做实验:模拟从c/s通信客户端client功能:1)显示服
5、务功能菜单Enteryourchoice:1.Savenoney2.Takemoney2)接收用户键入的功能号进行选择;3)将用户键入的功能号作为一条消息发送到消息队列,然后结束服务端功能:1)从消息队列接收client发送的一条消息;2)根据消息作如下处理:若消息为“1”,创建子进程1,子进程1加载服务模块save,该模块显示以下信息:Yourmoneywassaved!若消息为“2”,创建子进程2,子进程2加载服务模块take,该模块显示以下信息:Pleasetakeyourmoney!3)等待子进程终止后,server消息对列结束。
6、注意:1)save和take要事先编译连接好,放在同一目录下;2)先运行客户端进程,再运行服务端进程。1、client.c#include#include#include#include#include#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidclient(){inti;msgqid=msgget(MSGKEY,0777);/*
7、打开75#消息队列*/for(i=20;i>=1;i--){msg.mtype=i;printf("(client)sent%d",i);sleep(3);msgsnd(msgqid,&msg,1024,0);/*发送消息*/}exit(0);}main(){client();}server.c#include#include#include#include#include#defineMSGKEY75structmsgform
8、{longmtype;charmtext[1000];}msg;intmsgqid;voidserver(){msgqid=msgget(MSGKEY,0777
9、IPC_CREAT);/*创建75#消息队列*/do{msgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf("(server)received%ld",msg.mtype);sleep(3);}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*删除消息队列,归还资源*/exit(0);}main(
10、){server();}实验结果: