




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QQ 230817742 1 作者 叶建敏 3 26 2020 在 linux 系统下 消息队列的聊天室实现的过程 1 消息队列消息队列 消息队列是消息的链接表 存放在内核中并由消息队列标识符标识 我们将称消息队列为 队列 其标识符为 队列 I D m s g g e t 用于创建一个新队列或打开一个现存的队列 用于创建一个新队列或打开一个现存的队列 m s g s n d 用于将新消息添加到队列尾端 每个消息包含一个正长整型类型字段 一个非负长度以用于将新消息添加到队列尾端 每个消息包含一个正长整型类型字段 一个非负长度以 及实际及实际 数据字节 对应于长度 所有这些都在将消息添加到队列时 传送给 m s g s n d m s g r c v 用于从队列中取消息用于从队列中取消息 我们并不一定要以先进先出次序取消息 也可以按消息的类型字段取消息我们并不一定要以先进先出次序取消息 也可以按消息的类型字段取消息 每个队列都有一个 m s q i d d s 结构与其相关 此结构规定了队列的当前状态 如图 1 1 图 1 1 msqid ds 结构 调用的第一个函数通常是 m s g g e t 其功能是打开一个现存队列或创建一个新队列 include include include int msgget key t key int flag 返回 若成功则为消息队列 I D 若出错则为 1 调用 m s g s n d 将数据放到消息队列上 include include include int msgsnd int msqid const void pt r size tnbytes int flag 返回 若成功则为 0 若出错则为 1 正如前面提及的 每个消息都由三部分组成 它们是 正长整型类型字段 非负长度 nbytes 以及实际数据字节 对应于长度 消息总是放在队列尾端 ptr 指向一个长整型数 它 包含了正整型消息类型 在其后立即跟随了消息数据 若 nbytes 是 0 则无消息数据 若发送的 最长消息是 5 1 2 字节 则可定义下列结构 struct mymesg QQ 230817742 2 作者 叶建敏 3 26 2020 long mtype positive message type char mtext 512 message dat aof length n b y t e s 于是 p t r 就是一个指向 mymesg 结构的指针 接收者可以使用消息类型以非先进先出的次序取消 息 f l a g 的值可以指定为 IPC NOWAIT 这类似于文件 I O 的非阻塞 I O 标志 若消息队列已 满 或者是队列中的消息总数等于系统限制值 或队列中的字节总数等于系统限制值 则指定 IPC NOWAIT 使得 msgsnd 立即出错返回 EAGAIN 如果没有指定 IPC NO WAIT 则进程阻塞直 到 a 有空间可以容纳要发送的消息 或 b 从系统中删除了此队列 或 c 捕捉到一个信 号 并从信号处理程序返回 在第二种情况下 返回 E I D R M 标志符被删除 最后一种情 况则返回 E I N T R 注意 对消息队列删除的处理不是很完善 因为对每个消息队列并没有设置一 个引用计数器 对打开文件则有这种计数器 所以删除一个队列使得仍在使用这一队列的进程在 下次对队列进行操作时出错返回 信号量机构也以同样方式处理其删除 删除一个文件则要等到使 用该文件的最后一个进程关闭了它 才能删除文件的内容 msgrcv 从队列中取用消息 include include include int msgrcv intm s q i d void ptr size t nbytes long type int flag 返回 若成功则为消息数据部分的长度 若出错则为 1 如同 msgsnd 中一样 p t r 参数指向一个长整型数 返回的消息类型存放在其中 跟随其后 的是存放实际消息数据的缓存 nbytes 说明数据缓存的长度 若返回的消息大于 nbytes 而且在 f l a g 中设置了 MSGNOERROR 则该消息被截短 在这种情况下 不通知我们消息截短了 如果没 有设置这一标志 而消息又太长 则出错返回 E2BIG 消息仍留在队列中 参数 type 使我们可以指定想要哪一种消息 type 0 返回队列中的第一个消息 type 0 返回队列中消息类型为 t y p e 的第一个消息 type 0 返回队列中消息类型值小于或等于 t y p e 绝对值 而且在这种消息中 其类型值 又最小的消息 非 0t y p e 用于以非先进先出次序读消息 例如 若应用程序对消息赋优先权 那 么 t y p e 就可以是优先权值 如果一个消息队列由多个客户机和一个服务器使用 那么 t y p e 字段 可以用来包含客户机进程 I D 可以指定 flag 值为 IPC NOWAIT 使操作不阻塞 这使得如果没有 所指定类型的消息 则 msgrcv 出错返回 ENOMSG 如果没有指定 IPC NOWAIT 则进程阻塞直 至 a 有了指定类型的消息 或 b 从系统中删除了此队列 出错返回 E I D R M 或 c 捕 捉到一个信号并从信号处理程序返回 出错返回 E I N T R 实例一消息队列与流管道的时间比较 如若需要客户机和服务器之间的双向数据流 可以使用消息队列或流管道 2 简单的消息队列聊天列子 简单的消息队列聊天列子 服务端的代码 server c 作者 叶建敏 QQ 230817742 include include QQ 230817742 3 作者 叶建敏 3 26 2020 include include include include 以上为程序所必须的头文件 struct msgbuf long mtype 消息类型 char mtext 100 消息正文 定义一个结构体 msgbuf 用来存放消息的类型和消息的正文 int main FILE fp 定义文件变量指针 key t key pid t pid int msgid 队列 ID 号 struct msgbuf msg1 msg2 定义两个结构体变量 char wbuf 800 my name 20 others name 20 消息内容 本地名字 对方名字 key ftok 0 xFF 调用 ftok 函数 产生标准的 key if msgid msgget key IPC CREAT 0666 0 调用 msgget 函数 创建和打开消息队列 perror msgger error exit 0 printf plese input you name msg1 mtype 3 消息类型为 3 此消息接受让对方对方接受的对应的消息类型的姓名 memset msg1 mtext 0 100 设置缓冲区的内容 fgets wbuf 100 stdin 将标准输入到 wbuf 缓冲区 wbuf strlen wbuf 1 0 strcpy my name wbuf 把 wbuf 里的内容复制到 my name strcpy msg1 mtext wbuf msgsnd msgid 把消息添加到消息队列中 msgrcv msgid 根据消息队列的消息类型接受对应的消息对方的姓名 strcpy others name msg2 mtext 根据上面获得的数据把对方的的名字存储到 others name 存储是根据消息号存储 fflush stdout if pid fork 0 创建一个子进程 printf erro QQ 230817742 4 作者 叶建敏 3 26 2020 exit 0 if pid 0 while 1 msg1 mtype 1 memset msg1 mtext 0 100 刷新 printf s my name fgets wbuf 100 stdin wbuf strlen wbuf 1 0 strcpy msg1 mtext wbuf msgsnd msgid else while 1 msgrcv msgid if fp fopen data txt a NULL perror 打开失败记录 return 0 fprintf fp s s n others name msg2 mtext fclose fp printf r s s n s others name msg2 mtext my name fflush stdout 哭护短的代码 client c 作者 叶建敏 QQ 230817742 QQ 230817742 5 作者 叶建敏 3 26 2020 include include include include include include struct msgbuf long mtype 消息类型 char mtext 100 消息正文 int main FILE fp key t key pid t pid int msgid 队列 ID struct msgbuf msg1 msg2 char wbuf 800 my name 20 others name 20 key ftok 0 xFF if msgid msgget key IPC CREAT 0666 0 创建队列 perror msgger error exit 0 printf plese input you name msg1 mtype 4 消息类型为 3 此消息接受对方的姓名 memset msg1 mtext 0 100 设置缓冲区的内容 fgets wbuf 100 stdin 将标准输入到 wbuf 缓冲区 wbuf strlen wbuf 1 0 strcpy msg1 mtext wbuf strcpy my name wbuf msgsnd msgid msgrcv msgid strcpy others name msg2 mtext fflush stdout if pid fork 0 printf erro QQ 230817742 6 作者 叶建敏 3 26 2020 exit 0 if pid 0 while 1 msgrcv msgid if fp fopen data txt a NULL perror 打开失败记录 return 0 fprintf fp s s n others name msg2 mtext fclose fp printf r s s n s others name msg2 mtext my name fflush stdout else while 1 msg1 mtype 2 memset msg1 mtext 0 100 刷新 printf s my name fgets wbuf 100 stdin wbuf strlen wbuf 1 0 strcpy msg1 mtext wbuf msgsnd msgid 3 消息队列小例子消息队列小例子 include include include QQ 230817742 7 作者 叶建敏 3 26 2020 include include include include void msg show attr int msg id struct msqid ds msg info int ret 1 sleep 1 ret msgctl msg id IPC STAT if ret 1 printf get message wrong n exit 1 printf n printf now the crow word number is d n msg info msg cbytes printf the message number is d n msg info msg qnum printf the crow max number is d n msg info msg qbytes printf the last message s pid is d n msg info msg lspid printf the last receve meassage s pid is d msg info msg lrpid printf the last send time is s ctime printf the last receve time is s ctime printf the last changed time is s ctime printf the message UID is d n msg info msg perm uid printf the message GID is d n msg info msg perm gid int main int ret 1 int msg flags msg id key t key struct msgmbuf int mtype char mtext 20 struct msqid ds msg info struct msgmbuf msg mbuf struct msgmbuf msg mbuf1 struct msgmbuf msg mbuf2 int msg sflags msg rflags char msgpath home yejianmin QQ 230817742 8 作者 叶建敏 3 26 2020 key ftok msgpath f if key 1 printf 成功创建 n else printf KEY 失败 msg flags IPC CREAT msg id msgget key msg flags 0 x0777 if msg id 1 printf found message error n return 0 msg show attr msg id msg info msg sflags IPC NOWAIT msg mbuf mtype 1 msg mbuf1 mtype 2 msg mbuf2 mtype 3 memcpy msg mbuf mtext 测试消息 sizeof 测试消息 ret msgsnd msg id memcpy msg mbuf1 mtext 测试消息 1 sizeof 测试消息 1 ret msgsnd msg id memcpy msg mbuf2 mtext 测试消息 2 sizeof 测试消息 2 ret msgsnd msg id printf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 隆昌市知行中学2025-2026学年度第一学期初中八年级第一次月考数学试题(组卷)参考答案及评分意见
- 达尔文进化论课件
- 基于区块链技术的逆向物流溯源体系对回收率的提升机制探析
- 城市地下管廊出线盒抗震性能与防水密封的协同失效机制分析
- 可降解环保材料在切边齿形带中的应用潜力及降解性能评估体系
- 可持续生产模式探索:刀豆球蛋白生物发酵过程碳足迹与废弃物资源化
- 反应性稀释剂在微流控芯片中的可控聚合机制与工业转化瓶颈
- 反光轮廓标全生命周期碳足迹追踪与绿色供应链重构路径
- 双碳目标下的切换柜轻量化设计挑战与再生材料应用边界探索
- 区域产业集群发展模式对氟苯衍生物成本曲线的重构
- 现代化工绿色化工课件
- 单孔腹腔镜课程讲义课件
- 优秀初中语文说课课件
- 人工血管动静脉内瘘术后护理课件
- 普通逻辑ppt课件(完整版)
- GB∕T 16762-2020 一般用途钢丝绳吊索特性和技术条件
- 《小学语文课程与教学论》复习题
- DB32∕T 4065-2021 建筑幕墙工程技术标准
- 施工现场环保工作措施
- 资产清查服务方案模版
- 检具设计PPT.
评论
0/150
提交评论