单一消息队列完成客户-服务器进程间的双向通信

2023-11-02 06:18

本文主要是介绍单一消息队列完成客户-服务器进程间的双向通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单一消息队列完成客户—服务器进程间的双向通信,客户端接收输入字符串,如接收到的是exit字符串,直接退出,否则传送接收字符串到服务器端,并等待服务器端回传消息。服务器端:接收客户端请求,接收后将接收到的字符串逆序后回传到对应客户端。

//服务器端:
#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<sys/errno.h>
#include<string.h>
extern int errno;
struct mymsgbuf1
{long mtype;char ctext[100];
};
struct mymsgbuf
{long mtype;pid_t pid;char ctext[100];
};
void main(){struct mymsgbuf buf;struct mymsgbuf1 buf1;int msgid,ret,i,len;if((msgid = msgget(0x1234,0666|IPC_CREAT))<0){fprintf(stderr,"openmsg%xfailed.\n",0x1234);return;}while(1){memset(&buf,0,sizeof(buf));while((ret = msgrcv(msgid,&buf,sizeof(buf.ctext)+sizeof(buf.pid),1,0))<0){if(errno == EINTR)continue;return;}fprintf(stderr,"Receivemessageform%d,content:%s\n",buf.pid,buf.ctext);memset(&buf1,0,sizeof(buf1));//strcpy(buf1.ctext,buf.ctext);len=strlen(buf.ctext)for(i = 0;i < len;i++){buf1.ctext[len-1-i] = buf.ctext[i];}buf1.mtype = buf.pid;while((msgsnd(msgid,&buf1,strlen(buf1.ctext),0))<0){if(errno == EINTR)continue;return;}}
}
//客户端:
#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<sys/errno.h>
#include<string.h>
extern int errno;
struct tmymsgbuf1
{longmtype;charctext[100];
};
struct mymsgbuf
{long mtype;pid_t pid;char ctext[100];
};
void main()
{struct mymsgbuf buf;struct mymsgbuf1 buf1;int msgid,ret;pid_t pid = getpid();if((msgid = msgget(0x1234,0666|IPC_CREAT))<0){fprintf(stderr,"openmsg%xfailed.\n",0x1234);return;}while(1){memset(&buf,0,sizeof(buf));fgets(buf.ctext,sizeof(buf.ctext),stdin);if(!strcmp(buf.ctext,"exit"))break;buf.mtype = 1;buf.pid = pid;while((msgsnd(msgid,&buf,strlen(buf.ctext)+sizeof(buf.pid),0))<0){if(errno == EINTR)continue;return;}memset(&buf1,0,sizeof(buf1));while((ret = msgrcv(msgid,&buf1,sizeof(buf1.ctext),pid,0))<0){if(errno == EINTR)continue;return;}fprintf(stderr,"Receivemessageformservercontent:%s\n",buf1.ctext);}
}

在这里插入图片描述

一个服务器对应多个客户端,一个消息队列,客户端都将发送信息的类型设置为1,然后将自己的进程id放到数据部分,服务器接收所有客户端的请求,在返回给客户端信息的时候将类型设置为所接收的数据部分的进程id,客户端这边接收信息的函数里将接收类型设置为自己的进程id,就可以对应上了。

这篇关于单一消息队列完成客户-服务器进程间的双向通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328690

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win