当前位置: 代码迷 >> 综合 >> 用消息队列实现回射客户/服务器
  详细解决方案

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

热度:66   发布时间:2023-10-22 15:38:45.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 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);		//前四个字节是进程IDfputs(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;
}

    

  相关解决方案