文档详情

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

发布:2017-06-11约8.73千字共9页下载文档
文本预览下载声明
在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字段可以用来
显示全部
相似文档