用命名管道实现client和server端进行通信
【实现步骤】
- 创建两个没有关系的进程--》编写client和server源文件,并分别编译成可执行程序;
- 创建命名管道文件,用函数int mkfifo(const char *filename,mode_t mode);
- client端以写的方式打开管道文件,server端以读的方式打开管道文件
- 进行相应的通信--》我们实现server要接受到client发送的信息(同步)
client.cc代码实现
#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>using std::cout;
using std::endl;
using std::cin;#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>#include"comm.hpp"//用户端,用来写int main()
{//1. 以写方式打开管道文件int wfd=open(fifoname.c_str(),O_WRONLY);assert(wfd!=-1);(void)wfd;//2. 开始进程间通信,将用户的输入的信息写给服务端char buffer[NUM]={0};while(true){//2.1 换行控制服务端的信息同步// cout<<"请输入你的信息#";// char* msg=fgets(buffer,sizeof(buffer)-1,stdin);// assert(msg!=nullptr);// (void)msg;// msg[strlen(msg)-1]=0;// int n=write(wfd,msg,strlen(msg));// assert(n>0);// (void)n;//2.2 实现服务端和用户端输入的信息同步system("stty raw");int c = getchar();system("stty -raw");int n=write(wfd,(char*)&c,sizeof(char));assert(n>0);(void)n;}close(wfd);return 0;
}
server.cc代码实现
#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>using std::cout;
using std::endl;
using std::cin;#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>#include"comm.hpp"//服务端,进行读
int main()
{//1. 创建管道文件int ret=mkfifo(fifoname.c_str(),mode);assert(ret==0);(void)ret;cout<<"创建管道文件成功"<<endl;//2. 打开管道文件int rfd=open(fifoname.c_str(),O_RDONLY);assert(rfd!=-1);(void)rfd;cout<<"以读方式打开管道文件成功"<<endl;//3.开始通信,接受客户端传来的信息char buffer[NUM]={0};while(true){int n=read(rfd,buffer,sizeof(buffer)-1);if(n>0){buffer[n]=0;//cout<<"client#"<<buffer<<endl;printf("%c",buffer[0]);fflush(stdout);}else if(n==0){cout<<"client quit,me too"<<endl;break;}else{perror("read error:");break;}}ret=unlink(fifoname.c_str());assert(ret==0);(void)ret;cout<<"删除管道文件成功"<<endl;close(rfd);cout<<"关闭读端管道文件成功"<<endl;sleep(2);return 0;
}
makefile文件