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;
} (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

