linux下的消息队列聊天实现.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在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 sys/types.h #include sys/ipc.h #include sys/msg.h int msgget(key_t key, int flag) ; 返回:若成功则为消息队列I D,若出错则为- 1 调用m s g s n d将数据放到消息队列上。 #include sys/types.h #include sys/ipc.h #include sys/msg.h int msgsnd(int msqid, const void * pt r, size_tnbytes, int flag) ; 返回:若成功则为0,若出错则为- 1 正如前面提及的,每个消息都由三部分组成,它们是:正长整型类型字段、非负长度 (nbytes)以及实际数据字节(对应于长度)。消息总是放在队列尾端。ptr指向一个长整型数,它包含了正整型消息类型,在其后立即跟随了消息数据。(若nbytes是0,则无消息数据。)若发送的最长消息是5 1 2字节,则可定义下列结构: struct mymesg { 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 sys/types.h #include sys/ipc.h #include sys/msg.h 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字段可以用来

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档