最近做了一个小练习,要求如下:
1.设计协议
2.客户端只写公共管道,向服务端发信息
3.客户端只读私有管道,接收信息。
4.服务端维护用户登录列表
详细如图:
1.server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "protocl.h"
#include "list.h"
int main(void)
{
int status; //判断创建公有管道是否成功
int fd; //打开公有管道的文件描述符
int n; //用以保存读到的字节数
int fd_client; //打开私有管道的文件描述符
char name[MAXLINE] = {
0}; //保存客户端名
char buf[MAXLINE] = {
0}; //用以存放要写入管道或终端的提示信息
PROC proc; //协议,数据量大可以用堆
struct list *ls = create_list(); //创建链表,维护登录用户名列表
if ((status = mkfifo(SER_FIFO, 0644)) < 0)
sys_err("mkfifo server");
if ((fd = open(SER_FIFO, O_RDONLY)) < 0)
sys_err("open SER_FIFO");
while(1) {
if ((n = read(fd, &proc, sizeof(PROC))) > 0) {
if (proc.id == 1) { //收到的是登录包
insert_list(ls, 0, proc.src); //插入到登录列表
sprintf(buf, "%s is login\n", proc.src);
write(STDOUT_FILENO, buf,