实验目的

1、了解什么是消息、消息队列2、掌握消息传送的机理

msgget

作用:创建消息队列
原型:int msgget(key_t key, int msgflag)
参数:key:键值 IPC_PRIVATE
msgflag:权限
返回值:成功:消息队列ID
出错:-1
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
错误:

msgsnd

作用:写数据到消息队列
原型:int msgsnd(int msgid, const void *msggp, size_t msgsize, int msgflg)
参数:msgid消息队列标识符
msggp 消息结构
例如下:
struct msgtype
{
long mtype; /消息类型/
char mtext[256]; /消息正文/
}
msgsize,字节数
msgflg,标识符分类如下
0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列
IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回
IPC_NOERROR:若发送的消息大于size字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
错误:

msgrcv

作用:从消息队列中读数据

原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, intmsgflg)

参数:msqid:消息队列标识符

msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如上方的msggp
msgsz:消息的大小。
msgtyp:消息类型
msgtyp等于0 则返回队列的最早的一个消息
msgtyp大于0,则返回其类型为mtype的第一个消息
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息
错误:

msgctl

作用:控制消息队列
原型:int msggctl(intmsgid, int cmd, struct msgid_ds *buf)
参数:msgid 消息队列ID
cmd 命令参数
IPC_STAT 读取消息队列的数据结构, IPC_SET设置消息队列数据结构msgid_ds中的IPC操作权限、 IPC_RMID从系统内核汇总删除消息队列
返回值: 成功 0
出错-1
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

错误:

所作实验代码

要求

将server程序设置为能够并发处理多个客户的程序(参考下图的程序结构),服务器无限循环,CTRL+C结束,设计捕捉信号,信号处理中删除消息队列,服务器收到客户机的消息后发给不同客户机不同的应答消息(内容自定)。

server

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include <string.h>
#include<signal.h>
#define MSGKEY 75struct msgform
{long mtype;char mtext[256];
};
int msgid;
void stop(int a){printf("server will stop in one second\n");sleep(1);msgctl(msgid,IPC_RMID,0);exit(0);}
int main()
{int pid;if( (pid = fork()) == -1){perror("fork");exit(EXIT_FAILURE);}else if ( pid == 0)                //子进程{struct msgform msg1,msg2;msgid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列,操作权为可读、写、执行*/while(1){sleep(2);msgrcv(msgid,(void *) &msg1,256,1,0); /*接收flag==1消息*/printf("server receive client 1:%s",msg1.mtext);   strcpy(msg2.mtext,"server received!");msg2.mtype=1;msgsnd(msgid,&msg2,256,0);   /*发送消息*/}}else                             //父进程{    if((pid=fork())==-1){perror("fork");exit(0);}else if(pid==0){//second childstruct msgform msg1,msg2;msgid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列,操作权为可读、写、执行*/while(1){sleep(2);msgrcv(msgid,(void *) &msg1,256,2,0); /*接收flag==2消息*/printf("server receive client 2:%s",msg1.mtext);   strcpy(msg2.mtext,"server received!");msg2.mtype=2;msgsnd(msgid,&msg2,256,0);   /*发送消息*/}}else{printf("press ctrl+c exit!!!\n");signal(SIGINT,stop); while(1);}}
}

client

有两个client,代码一致

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#define MSGKEY 75
struct msgform
{long mtype;        /*消息类型*/char mtext[256];    /*消息正文*/
};
int msgid;
int main()
{ char buffer[256];struct msgform msg1,msg2;int msgid,pid,*pint;msgid=msgget(MSGKEY, 0777); /*打开消息队列*/printf("Enter the mssage to send:");fgets(msg1.mtext,156,stdin);msg1.mtype = 1;msgsnd(msgid,&msg1,256,0);  /*发送消息*/msgrcv(msgid,&msg2,256,1,0);    /*接收类型为2的消息*/printf("receive from server: %s\n",msg2.mtext);
}

运行结果

消息队列通信实验报告总结相关推荐

  1. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  2. 利用三层交换机实现VLAN的通信实验报告

    利用三层交换机实现VLAN的通信实验报告<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  3. linux.调整收发队列,linux消息队列通信

    程序目的:学习linux消息队列通信 所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl() 首先介绍每个函数的用法: (1)msgget 使用格式: #include ...

  4. qt使用消息队列服务器,qt代码实现消息队列通信

    qt代码实现消息队列通信 内容精选 换一换 模式介绍:命令模式(command)命令模式的解释如下:向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指 ...

  5. 伪随机序列调相位C语言,混沌通信实验报告范文

    混沌通信实验报告范文 篇一:混沌通信实验仪实验操作步骤 实验一: 非线性电阻的伏安特性实验 1.实验目的:测绘非线性电阻的伏安特性曲线 2.实验装置:混沌通信实验仪. 3.实验对象:非线性电阻模块. ...

  6. 单片机双机通信c语言实验心得,单片机双机通信实验报告.doc

    单片机双机通信实验报告 计算机与信息工程学院综合性实验报告 专业:物联网 年级/班级: 2015-2016学年第一学期 课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目 ...

  7. 计算机网络实验vc6实现串口通信,用vc的串口通信实验报告.docx

    文档介绍: 编程实验报告实验题目:串口通信班级:学号:姓名:日期:2015-6-8一.实验要求把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯.可以利用高级语言.C语言编程实现,要求程 ...

  8. uCOSIII_消息队列-消息传递实验分析

    实验内容: 创建4个任务: static  void  AppTaskStart(void *p_arg); static  void  main_task(void *p_arg); static ...

  9. 计算机网络与通信实验报告——HTTP协议分析

    文章目录 一.实验目的 二.实验原理 三.实验过程 1.捕获访问网站的数据包 2.过滤TCP和HTTP的数据包 3.TCP三次握手 4.HTTP中同一URL的多重请求 四.总结 一.实验目的 1.熟悉 ...

最新文章

  1. 作业盒子完成1.5亿美元D轮融资,用AI普及教育资源
  2. 一个女程序员的男友需求说明书(转)
  3. 前端学习(1186):双向数据绑定
  4. leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
  5. 【AI 顶会】NIPS2019接收论文完整列表
  6. python和pycharm要安装在同一个路径下吗_无法在pyCharm中导入与Anaconda一起安装的文件:需要将Anaconda添加到Python路径吗?...
  7. Java与C语言混合编程
  8. android强制结束进程_Android完全强制退出应用程序
  9. CentOS 7配置Docker Storage
  10. AD(PCB)知识总结
  11. 软件项目管理期末复习---项目立项
  12. 服务器的类型都有哪些
  13. 红米android10参数,红米10x5g手机参数红米10x5g手机参数有哪些
  14. videojs中文文档详解_HTTP的世界观(附HTTP/3中文翻译)
  15. 安装SQL Server 2000时出现“以前的某个程序安装已在安装……”
  16. java web课设
  17. NAC学习笔记(手写版)
  18. 江苏科技大学计算机科学与工程,江苏科技大学
  19. 题目练习_跳骚_幸运数字_解方程
  20. AI、新材料、5G、智慧城市,未来的社会场景在高交会提前上演

热门文章

  1. Reactor与Proactor的区别
  2. 基于MacOSX平台下的二维码扫码功能
  3. MySQL之MHA高可用配置及故障切换——超详细的理论+实验!
  4. Spring Web MVC详解
  5. 工艺:钣金件对钢板的要求
  6. 学习FastDFS上传下载时遇到的问题
  7. uniapp 复制到剪切板 四端适配
  8. baostock证券数据集下使用LSTM模型预测A股走势
  9. DevData Talks | 微众银行有哪些研发效能实践与思考?一起来拓展认知边界!
  10. [转]SMTP标准协议rfc821中文版