简单的C/S模型
程序要求:
按照下图方式进行编程:
程序如下:
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
int fifo_fd;
char buf[100];
int open_flag = 0; //fifo是否打开的标志,1为打开,0为未打开
if (argc < 2)
{
fprintf(stderr, "usages: %s fifo\n", argv[0]);
exit(-1);
}
memset(buf, 0, sizeof(buf));
if (mkfifo(argv[1], 0666) < 0) //创建FIFO管道
{
if (errno == EEXIST) //应对FIFO已经存在的情况
{
if ((fifo_fd = open(argv[1], O_RDWR)) < 0)
{
perror("failed to open fifo");
exit(-1);
}
open_flag = 1;
}
}
if (open_flag == 0)
{
if ((fifo_fd = open(argv[1], O_RDWR)) < 0)
{
perror("failed to open fifo");
exit(-1);
}
}
while (read(fifo_fd, buf, sizeof(buf)) > 0) //读取fifo中的数据
{
printf("read : %s\n", buf);
}
return 0;
}
client.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
int fifo_fd;
char buf[100];
if (argc < 2)
{
fprintf(stderr, "usages: %s fifo\n", argv[0]);
exit(-1);
}
memset(buf, 0, sizeof(buf));
if ((fifo_fd = open(argv[1], O_WRONLY)) < 0) //fifo由服务器创建了,因此客户端只要打开即可
{
perror("failed to open fifo");
exit(-1);
}
while (1)
{
printf(">");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = 0;
if (strncmp(buf, "quit", 4) == 0)
break;
write(fifo_fd, buf, strlen(buf) + 1); //往fifo中写入数据
}
return 0;
}