说明
①虽然说是本地聊天室,但是由于个人能力的原因,只是实现了两个客户端的通信。
服务器客户端介绍
①服务器编写中先定义三个管道,以及进行宏定义。然后定义文件描述符,和读写buf。创建一个公共管道,并对其进行属性设置,并依照次上述步骤,分别完成对私有管道1和私有管道2的设置。接下来循环执行功能,首先进行打开,然后进行判断为哪个客户端。若为客户端1,打开私有管道1,然后接收信息,并输出在屏幕上。
②客户端对公共管道和私有管道、文件描述符、读写buf进行定义。私有管道,并进行内容的读出。使用fork产生父子进程,子进程中进行数据的读出。打开私有管道1,把数据读出并打印。在父进程中,进行数据的写入。打开公共管道并输入数据。若输入end,则子进程,删除管道,并打印退出。客户端2一此类推。
使用说明
①分别在三个terminal中输入./srever、./client1、./client2,在客户端1或客户端2输入内容,服务器可接收两个客户端的内容,并进行识别。在两个客户端中分别可显示自己的内容已经发送和辨别来自不同客户端的内容。
运行结果
源码
server.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<linux/stat.h>
#define PUBLIC_FIFO "PUBFIFO"
#define PRIVATE1_FIFO "PRIFIFO1"
#define PRIVATE2_FIFO "PRIFIFO2"
#define PRIVATE1_HEADER "Client1's message:"
#define PRIVATE2_HEADER "Client2's message:"
#define SERVER_REPLY "Send message successfully,"
int main()
{
int pubfd;
int prifd1;
int prifd2;
char str1[40] = "Client1 loading successfully.";
char str2[40] = "Client2 loading successfully.";
char readbuf[80] = "";
umask(0);
mknod(PUBLIC_FIFO,S_IFIFO|0666,0);
mknod(PRIVATE1_FIFO,S_IFIFO|0666,0);
mknod(PRIVATE2_FIFO,S_IFIFO|0666,0);
prifd1=open(PRIVATE1_FIFO,O_CREAT|O_WRONLY);
prifd2=open(PRIVATE2_FIFO,O_CREAT|O_WRONLY);
write(prifd1,str1,strlen(str1));
write(prifd2,str2,strlen(str2));
close(prifd1);
close(prifd2);
printf("Write data to client.\n");
while(1)
{
memset(readbuf,0,80);
if((pubfd = open(PUBLIC_FIFO,O_RDWR))==-1)
{
printf("Open fifo failed.\n");
exit(1);
}
if(read(pubfd,readbuf,80)!=-1)
{
printf("Received string:%s\n",readbuf);
close(pubfd);
}
if(strncmp(readbuf,PRIVATE1_HEADER,