System V消息队列(3)

server进程发送时,将mtype指定为接收到的client进程的pid

client进程发送的时候,mtype指定为自己进程的pid

client进程接收时,需要将msgtyp指定为自己进程的pid,只接收消息类型为自己pid的消息;

// client/server进程接收/发送的数据结构const int MSGMAX = 8192;struct msgBuf{long mtype;//保存客户进程的pid(需要将pid强制转换成为long)char mtext[MSGMAX]; //保存客户进程真实发送的数据};//server.cppvoid echoServer(int msgid){struct msgBuf buf;int nrcv;while (true){bzero(&buf, sizeof(buf));if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)err_exit("msgrcv error");cout << "recv: " << buf.mtext;if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)err_exit("msgsnd error");}}int main(){key_t key = ftok("/tmp/echoSeed", 0x1234);int msgid = msgget(key, IPC_CREAT|0666);if (msgid == -1)err_exit("msgget error");echoServer(msgid);}//client.cppvoid echoServer(int msgid){struct msgBuf buf;int nrcv;while (true){bzero(&buf, sizeof(buf));if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)err_exit("msgrcv error");cout << "recv: " << buf.mtext;if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)err_exit("msgsnd error");}}int main(){key_t key = ftok("/tmp/echoSeed", 0x1234);int msgid = msgget(key, IPC_CREAT|0666);if (msgid == -1)err_exit("msgget error");echoServer(msgid);}

附-ftok用法

#include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);

isused(如果文件名与proj_id的有效位全都相同的话,则生成的key一定也是相同的).Thevaluereturnedshouldbedifferentwhen

the(simultaneouslyexisting)filesortheprojectIDsdiffer.

RETURNVALUE Onsuccess,thegeneratedkey_tvalueisreturned.Onfailure-1isreturned,

witherrnoindicatingtheerrorasforthestat(2)systemcall.

,尝到你和你在一起的快乐,你是唯一能让我尝到酸甜苦辣的人。

System V消息队列(3)

相关文章:

你感兴趣的文章:

标签云: