linux下的消息队列聊天实现

linux下的消息队列聊天实现

ID:8796091

大小:95.00 KB

页数:9页

时间:2018-04-08

linux下的消息队列聊天实现_第1页
linux下的消息队列聊天实现_第2页
linux下的消息队列聊天实现_第3页
linux下的消息队列聊天实现_第4页
linux下的消息队列聊天实现_第5页
资源描述:

《linux下的消息队列聊天实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、QQ:2308177429作者:叶建敏8/11/2021在linux系统下消息队列的聊天室实现的过程:1.消息队列消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。我们将称消息队列为“队列”,其标识符为“队列ID”。msgget用于创建一个新队列或打开一个现存的队列。msgsnd用于将新消息添加到队列尾端。每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节(对应于长度),所有这些都在将消息添加到队列时,传送给msgsnd。msgrcv用于从队列中取消息。我们并不一定要以先进先出次序取消息,也可以按

2、消息的类型字段取消息。每个队列都有一个msqidds结构与其相关。此结构规定了队列的当前状态。如图(1-1)图(1-1)msqid_ds结构调用的第一个函数通常是msgget,其功能是打开一个现存队列或创建一个新队列。#include#include#includeintmsgget(key_tkey,intflag);返回:若成功则为消息队列ID,若出错则为-1调用msgsnd将数据放到消息队列上。#include#inc

3、lude#includeintmsgsnd(intmsqid,constvoid*ptr,size_tnbytes,intflag);返回:若成功则为0,若出错则为-1正如前面提及的,每个消息都由三部分组成,它们是:正长整型类型字段、非负长度(nbytes)以及实际数据字节(对应于长度)。消息总是放在队列尾端。ptr指向一个长整型数,它包含了正整型消息类型,在其后立即跟随了消息数据。(若nbytes是0,则无消息数据。)若发送的最长消息是512字节,则可定义下列结构:stru

4、ctmymesg{QQ:2308177429作者:叶建敏8/11/2021longmtype;/*positivemessagetype*/charmtext[512];/*messagedat,aoflengthnbytes*/};于是,ptr就是一个指向mymesg结构的指针。接收者可以使用消息类型以非先进先出的次序取消息。flag的值可以指定为IPC_NOWAIT。这类似于文件I/O的非阻塞I/O标志。若消息队列已满(或者是队列中的消息总数等于系统限制值,或队列中的字节总数等于系统限制值),则指定IPC_NOWA

5、IT使得msgsnd立即出错返回EAGAIN。如果没有指定IPC_NOWAIT,则进程阻塞直到(a)有空间可以容纳要发送的消息,或(b)从系统中删除了此队列,或(c)捕捉到一个信号,并从信号处理程序返回。在第二种情况下,返回EIDRM(“标志符被删除”)。最后一种情况则返回EINTR。注意,对消息队列删除的处理不是很完善。因为对每个消息队列并没有设置一个引用计数器(对打开文件则有这种计数器),所以删除一个队列使得仍在使用这一队列的进程在下次对队列进行操作时出错返回。信号量机构也以同样方式处理其删除。删除一个文件则要等到

6、使用该文件的最后一个进程关闭了它,才能删除文件的内容。msgrcv从队列中取用消息。#include#include#includeintmsgrcv(intmsqid,void*ptr,size_tnbytes,longtype,intflag);返回:若成功则为消息数据部分的长度,若出错则为-1如同msgsnd中一样,ptr参数指向一个长整型数(返回的消息类型存放在其中),跟随其后的是存放实际消息数据的缓存。nbytes说明数据缓存的长度。若返回

7、的消息大于nbytes,而且在flag中设置了MSGNOERROR,则该消息被截短(在这种情况下,不通知我们消息截短了)。如果没有设置这一标志,而消息又太长,则出错返回E2BIG(消息仍留在队列中)。参数type使我们可以指定想要哪一种消息:type==0返回队列中的第一个消息。type>0返回队列中消息类型为type的第一个消息。type<0返回队列中消息类型值小于或等于type绝对值,而且在这种消息中,其类型值又最小的消息。非0type用于以非先进先出次序读消息。例如,若应用程序对消息赋优先权,那么type就可以是

8、优先权值。如果一个消息队列由多个客户机和一个服务器使用,那么type字段可以用来包含客户机进程ID。可以指定flag值为IPC_NOWAIT,使操作不阻塞。这使得如果没有所指定类型的消息,则msgrcv出错返回ENOMSG。如果没有指定IPC_NOWAIT,则进程阻塞直至(a)有了指定类型的消息,或(b)从系统中删除了此队列(出错

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。