服务器开启一个管道,并对这个管道进行读取操作。多个客户端对这个管道进行写入操作。服务器对于
读管道进行阻塞以等待所有的客户端向这个管道写入数据。对于每个客户端只要它写入的数据小于PIPE_BUF.系统可以保证每一个客户端写入的数据都是各自的,而不会混乱的交错在一起。
对于服务器发给客户端的应答,需要针对每一个客户端建立一个FIFO管道来反馈消息,之后客户端读操作监听返回的消息。
服务端的代码
#include "pub.h" #include <ctype.h> int main() { int server_fifo_fd,client_fifo_fd; struct data_pass mydata; int read_res; char client_info[256]; char *temp_char_ptr; //建立服务端监听FIFO管道 mkfifo(SERVER_FIFO_NAME,0777); printf("waiting client to come\n"); //以读的方式等待客户端的写入 server_fifo_fd = open(SERVER_FIFO_NAME,O_RDONLY); if(-1 == server_fifo_fd) { printf("open fifo file failture\n"); exit(-1); } //阻塞等待所有客户端的接入 sleep(10); do { //读取客户端发送的消息 read_res = read(server_fifo_fd,&mydata,sizeof(mydata)); if(read_res > 0) { printf("server get client data from %d,data is %s\n",mydata.clien_id,mydata.some_date); temp_char_ptr = mydata.some_date; while(*temp_char_ptr != '\0') { *temp_char_ptr = toupper(*temp_char_ptr); temp_char_ptr++; } sprintf(client_info,CLIENT_FIFO_NAME,mydata.clien_id); //向客户端指定的管道发送消息 client_fifo_fd = open(client_info,O_WRONLY); if(client_fifo_fd != -1) { //向指定管道写入消息 write(client_fifo_fd,&mydata,sizeof(mydata)); printf("server send data to client %d,data is %s\n",mydata.clien_id,mydata.some_date); close(client_fifo_fd); } } }while(read_res > 0); close(server_fifo_fd); exit(0); }
客户端程序
#include "pub.h" #include <ctype.h> int main() { int server_fifo_fd,client_fifo_fd; struct data_pass mydata; int read_res; char client_info[256]; char *temp_char_ptr; //向服务器的FIFO管道写入数据 server_fifo_fd = open(SERVER_FIFO_NAME,O_WRONLY); if(-1 == server_fifo_fd) { printf("open fifo file failture\n"); exit(-1); } mydata.clien_id = getpid(); sprintf(client_info,CLIENT_FIFO_NAME,mydata.clien_id); //建立客户端唯一的管道,接收服务器返回的应答 read_res = mkfifo(client_info,0777); if(-1 == read_res) { printf("create fifo file failture\n"); exit(-1); } for(int iIndex = 0; iIndex < 5 ; iIndex ++) { sprintf(mydata.some_date,"hello from %d\n",mydata.clien_id); printf("client %d send %s\n",mydata.clien_id,mydata.some_date); //向服务器发送数据,通过服务器管道 write(server_fifo_fd,&mydata,sizeof(mydata)); //接收服务器应答数据,通过客户端管道, //并阻塞直到服务器应答 client_fifo_fd = open(client_info,O_RDONLY); if(-1 != client_fifo_fd) { //读取服务器应答数据 if(read(client_fifo_fd,&mydata,sizeof(mydata)) > 0) { printf("reveived:%s\n",mydata.some_date); } close(client_fifo_fd); } } close(server_fifo_fd); unlink(CLIENT_FIFO_NAME); exit(0); }
公共文件
#ifndef pubH #define pubH #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <limits.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define SERVER_FIFO_NAME "/home/administrator/桌面/Java/pipe/serverfifofile" #define CLIENT_FIFO_NAME "/home/administrator/桌面/Java/pipe/client_%d_file" #define BUFF_SIZE 20 struct data_pass { pid_t clien_id; char some_date[BUFF_SIZE + 1]; }; #endif