Linux管道用什么来实现的,linux利用管道来实现本地聊天室

//server.c

#include "Packet.h"

#include

#include

#include

#include

#include

#include

#include

#include

void sys_err(char *str, int exitno)

{

perror(str);

exit(exitno);

}

int find(char *Name, char LoginList[100][5], int LoginNum)

{

int i = 0;

for (; i < LoginNum; ++i)

{

if (strcmp(LoginList[i], Name) == 0)

{

return i;

}

}

return -1;

}

void send(const Packet *packet)

{

int fd;

fd = open(packet->dest, O_RDWR);

printf("%s send\n", packet->dest);

if (fd < 0)

{

sys_err("send", 1);

}

if (write(fd, packet, sizeof(Packet)) < 0)

{

sys_err("write", 1);

}

}

void recv(int fd)

{

Packet packet;

int len, LoginNum = 0, i, res;

char LoginList[100][5];

while (1)

{

len = read(fd, &packet, sizeof(Packet));

//大于0 说明读取成功

if (len > 0)

{

switch(packet.id)

{

//一号为登录包

case 1:

strcpy(LoginList[LoginNum++], packet.src);

if (mkfifo(packet.src, 0777) > 0)

{

sys_err(packet.src, 3);

}

printf("%s Login\n", packet.src);

break;

//二号为聊天包

case 2:

if (find(packet.dest, LoginList, LoginNum) == -1)

{

Packet temp;

temp.id = 3;

strcpy(temp.src,"ser");

strcpy(temp.dest, packet.src);

sprintf(temp.data, "%s is not online", packet.dest);

send(&temp);

}

send(&packet);

break;

//三号为退出包

case 3:

res = find(packet.src, LoginList, LoginNum);

if (res >= 0)

{

LoginNum--;

for (i = res; i < LoginNum; ++i)

{

strcpy(LoginList[i], LoginList[i+1]);

}

printf("%s Logout\n", packet.src);

}

break;

}

}

}

}

int main()

{

int fd;

if (mkfifo("serverfifo", 0666) > 0)

{

sys_err("mkfifo", 1);

}

fd = open("serverfifo", O_RDWR);

if (fd < 0)

{

sys_err("open", 2);

}

recv(fd);

close(fd);

return 0;

}

//Packet.h

typedef struct

{

int id;

char src[5];

char dest[5];

char data[100];

}Packet;利用管道来简单的实现了一下本地聊天室,可以进一步的扩充将服务器端设置为守护进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值