用消息队列实现回射客户/服务器

服务器端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define MSGMAX 8000

#define ERR_EXIT(m)				\
		do				\
		{				\
			perror(m);		\
			exit(EXIT_FAILURE);	\
		}while(0);			\

struct msgbuf {
	long mtype;       /* message type, must be > 0 */
	char mtext[MSGMAX];    /* message data */
};

void echo_srv(int msgid)
{
	int n;
	struct msgbuf msg;
	memset(&msg,0,sizeof(msg));
	while(1)
	{
		if( (n = msgrcv(msgid,&msg,MSGMAX,1,0)) < 0)	//接受消息
			ERR_EXIT("msgrcv");
		int pid;
		pid = *((int*)msg.mtext);		//前四个字节是进程ID
	
		fputs(msg.mtext+4,stdout);		//将接受到的数据打印
		msg.mtype = pid;
		msgsnd(msgid,&msg,n,0);		//回射接收到的数据
		
	}
}

int main(int argc,char *argv[])
{
	int msgid;
	//创建一个消息队列
	msgid = msgget(1234,IPC_CREAT | 0666);
	if(msgid == -1)
		ERR_EXIT("msgget");

	echo_srv(msgid);
	return 0;
}

客户端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define ERR_EXIT(m)				\
		do				\
		{				\
			perror(m);		\
			exit(EXIT_FAILURE);	\
		}while(0);			\

#define MSGMAX 8000
struct msgbuf {
	long mtype;       /* message type, must be > 0 */
	char mtext[MSGMAX];    /* message data */
};


void echocli(int msgid)
{
	int pid;
	int n;
	pid = getpid();
	struct msgbuf msg;
	memset(&msg,0,sizeof(msg));
	msg.mtype = 1; 
	while(fgets(msg.mtext+4,MSGMAX,stdin) != NULL)
	{
		*((int*)msg.mtext) = pid;	//将pid保存到前四个字节
		msg.mtype = 1; 
		if( (msgsnd(msgid,&msg,4+strlen(msg.mtext+4),0)) < 0 )	//发送消息
			ERR_EXIT("msgsnd");
	
		memset(msg.mtext+4,0,MSGMAX);
		
		if( (n = msgrcv(msgid,&msg,MSGMAX,pid,0)) < 0)    //接受回射消息
                        //ERR_EXIT("msgrcv");
		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");

	echocli(msgid);
	return 0;
}

    

猜你喜欢

转载自blog.csdn.net/qq_34938530/article/details/80029660
今日推荐