单机模式下的多人聊天

单机模式下的多人聊天

ID:37255597

大小:23.13 KB

页数:21页

时间:2019-05-20

单机模式下的多人聊天_第1页
单机模式下的多人聊天_第2页
单机模式下的多人聊天_第3页
单机模式下的多人聊天_第4页
单机模式下的多人聊天_第5页
资源描述:

《单机模式下的多人聊天》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、进程间通信方式之:消息队列UNIX早期通信机制之一的信号能够传送的信息量有限,而管道只能传送无格式的字节流,这无疑给应用程序开发带来了不便,消息队列(也称报文队列)则克服了这些缺点.一、消息队列概述消息队列从本质上是一链表,它是由一个消息一个消息串联起来的链表.可以将消息看做一个记录,每个具有特定的格式.其中一个进程可以向消息队列内按照一定的规则添加新消息,而另外一些进程则可以从消息队列中读走这些消息.在Linux系统中,主要有两种消息队列:POSIX消息队列和系统V消息队列.后者目前被大量的使用.1.POSIX:possibleoperatesys

2、teminterface可移植操作系统接口.2.系统V消息队列是随内核持续的,只有在内核重启或人工删除时,该消息队列才会被删除.这里,"随内核的持续性"是指消息队列并不会随用户程序的结束而消失,除非内核重启或在用户的应用程序中删除了该消息队列,这样消息队列才会被删除.正因为消息队列的内核持续性,系统要求每个消息队列在系统范围内对应唯一的键值.所以,要获取消息队列的描述字,必须提供该消息队列的键值.这里的"键值"类似于磁盘上的文件,每个文件都需要一个文件名.二、消息队列与管道的比较1、消息队列允许一个或多个进程向它写入或读取消息.但消息队列中的消息有这

3、样一个特点,当在一个进程中成功的读取了一条消息后,队列中的这条消息将被删除,其它进程将看不到该消息了.这点类似于管道.比如当读进程从管道内读取到数据后,其它进程将看不到这些数据了.2、管道和命名管道的通信数据都采用先进先出的原则.而消息队列可以实现消息的随机查询,消息并不一定以先进先出的次序读取,也可以按照消息的类型读取,这比管道或命名管道更有优势.三、消息队列的操作常用消息队列的API有如下5种:(1)键值的获取在Linux中,消息队列的产生是依据消息队列的键值(key)而产生的,且key具有唯一性.#include#in

4、cludekey_tftok(char*pathname,charproj)函数功能:返回文件名对应的键值参数pathname:路径文件名(通过文件名来获取该文件的键值)参数proj:项目名(不为0的整数即可)(2)消息的创建创建于打开#include#include#includeintmsgget(key_tkey,intmsgflg)函数功能:利用键值(key)来创建或打开消息队列参数key:键值,由ftok()函数获得.参数msgflg:标志位返回值:

5、与键值key相对应的消息队列描述字,该描述字的功能类似于文件的文件描述符,或进程的ID.出错返回-1.Attention!!!msgflg(标志位)常用的几种形式:1.IPC_CREAT:用于创建新的消息队列2.IPC_EXCL:建议与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误.3.IPC_NOWAIT:用户当读写消息队列时,要求无法得到满足,进程不阻塞.比如该消息队列已满,用户无法再向该消息队列内写入数据;或该消息队列已空,用户无法再从该消息队列内读出数据;此时在默认情况下进程会发生阻塞.但如果用户在该标志位处使用了标

6、志位IPC_NOWAIT,则该进程将不会阻塞.4.0:这是标志位的默认值0,表示当读写消息队列时,要求无法得到满足,进程阻塞.创建消息队列的方法:若整个系统中没有和键值(key)相对应的消息队列,此时调用函数msgget,且标志位msgflg处使用IPC_CREAT,这样就创建了一个消息队列.intopen_queue(key_tkeyval){intqid;if((qid=msgget(keyval,IPC_CREAT))==-1)return(-1);returnqid;//返回该消息队列的ID}(3)向消息队列中发送消息创建好了消息队列后,有些

7、进程就可以向该消息队列内写入消息,有些进程就可以从该消息队列内读取消息.#include#include#includeintmsgsnd(intmsqid,structmsgbuf*msgp,intmsgsz,intmsgflg)函数功能:将新消息添加到队列尾端返回值:发送失败则返回-1参数msqid:已打开的消息队列的ID,表示需要向哪一个消息队列内发送消息,由getmsg()函数的返回值决定.参数*msgp:该结构体内存放了需要发送的消息,这是一个结构体类型的buffer.消

8、息队列与管道的最大区别在于消息队列内的消息具有一定的格式,而管道却没有.而消息队列内消息的格式是由struc

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

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

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