linux System V消息队列实现回射客户/服务器和msgsnd、msgrcv函数
发布时间:2016-09-26 09:41:56 所属栏目:Linux 来源:站长网
导读:一、msgsnd 和 msgrcv 函数 #include sys/types.h #include sys/ipc.h #include sys/msg.h 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, cons
对于服务器端来说,接收到一个消息结构体的类型如果为1,表示是客户请求,而mtex 字段的前4个字节存放着不同进程 的pid ,后续字节才是真正的数据,服务器回射客户端时,将pid 作为类型,mtex 为实际数据,客户端只接收对应类型的 数据,故可以区分不同客户端。 程序如下: echoser.c #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include<unistd.h> #include<errno.h> #include<string.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) #define MSGMAX 8192 struct msgbuf { long mtype; char mtext[MSGMAX]; }; void echo_ser(int msgid) { struct msgbuf msg; memset(&msg, 0, sizeof(msg)); int nrcv = 0; while (1) { if ((nrcv = msgrcv(msgid, &msg, MSGMAX, 1, 0)) < 0); int pid = *((int *)msg.mtext); fputs(msg.mtext + 4, stdout); msg.mtype = pid; msgsnd(msgid, &msg, nrcv, 0); memset(&msg, 0, sizeof(msg)); } } int main(int argc, char *argv[]) { int msgid; msgid = msgget(1234, IPC_CREAT | 0666); if (msgid == -1) ERR_EXIT("msgget"); echo_ser(msgid); return 0; } echocli.c #include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include<unistd.h> #include<errno.h> #include<string.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) #define MSGMAX 8192 struct msgbuf { long mtype; char mtext[MSGMAX]; }; void echo_cli(int msgid) { int nrcv; int pid = getpid(); struct msgbuf msg; memset(&msg, 0, sizeof(msg)); msg.mtype = 1; *((int *)msg.mtext) = pid; while (fgets(msg.mtext + 4, MSGMAX, stdin) != NULL) { if (msgsnd(msgid, &msg, 4 + strlen(msg.mtext + 4), IPC_NOWAIT) < 0) ERR_EXIT("msgsnd"); memset(msg.mtext + 4, 0, MSGMAX - 4); if ((nrcv = msgrcv(msgid, &msg, MSGMAX, pid, 0)) < 0) ERR_EXIT("msgsnd"); fputs(msg.mtext + 4, stdout); memset(msg.mtext + 4, 0, MSGMAX - 4); } } int main(int argc, char *argv[]) { int msgid; msgid = msgget(1234, 0); if (msgid == -1) ERR_EXIT("msgget"); echo_cli(msgid); return 0; } (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |