linux消息队列实现回射服务器

话不多说,看代码!

一、框架

二、服务器代码

#include<unistd.h>
#include<sys/types.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  8192
struct msgbuf  {//消息缓冲区
         long mtype;  //消息类型,从消息队列中读取消息的一个重要依据就是消息的类型
         char mtext[MSGMAX];  //消息内容
};
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("msgsnd");//从消息队列中取出消息
 
   int pid;
   pid=*((int *)msg.mtext);//把消息队列中前4个字节取出来,假设作为进程号码
 
 
 fputs(msg.mtext+4,stdout);//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/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  8192
struct msgbuf  {//消息缓冲区
         long mtype;  //消息类型,从消息队列中读取消息的一个重要依据就是消息的类型
         char mtext[MSGMAX];  //消息内容
};
void echo_cli(int msgid)
{
int pid;
pid=getpid();//获取进程号,要把进程号也发送过去
int n;
struct msgbuf msg;
memset(&msg,0,sizeof(msg));
 
*((int *)msg.mtext)=pid;
msg.mtype=1;//类型为1,代表
  while(fgets(msg.mtext+4,MSGMAX,stdin)!=NULL)//不断从键盘获取数据
  {
 
  if((n=msgsnd(msgid,&msg,4+strlen(msg.mtext+4),0))<0)    ERR_EXIT("msgsnd");//向消息队列发送消息
 
   memset(msg.mtext+4,0,MSGMAX-4);//把接收到的内容先清空
   if((n=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; 
}   

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值