使用IO多路复用实现转发服务器

//以下代码仅供参考,如有错误请评论指正,谢谢!

IO多路复用:允许同时对多个输入输出进行控制。
原理:构建一张文件描述符表,使用函数select,不断地监听表中的文件描述符是否可读(是否有数据),如果有则返回对应的文件描述符,并擦除其余文件描述符。
使用步骤:
(1)定义一个文件描述符集合 fd_set set;
(2)将集合清空:FD_ZERO(&set);
(3)将想关注的文件描述符添加到集合中 FD_SET(fd, &set);
(4)监测集合中的文件描述符是否有动作(是否有数据)使用select()函数;
(5)对返回的文件描述符进行IO操作。
另:从集合中删除指定文件描述符FD_CLR(fd, &set);
判断指定文件描述符是否在集合中FD_ISSET(fd, &set);
//服务端
server.c

#include "head.h" //除内核链表所需头文件外的其他头文件
#include "kernel_list.h"//内核链表所需头文件

//设计客户端节点
struct client
{
   
   
	char ip[50];	//存客户端ip
	unsigned int port;	//存客户端端口
	int confd;	//存客户端连接套接字
	
	struct list_head list;	//定义内核链表
};

//链表头节点
struct client *head = NULL;


//初始化头节点
struct client *list_init(void)
{
   
   
	struct client *head = calloc(1, sizeof(struct client));
	if(head == NULL)
	{
   
   
		perror("calloc failed");
		exit(0);
	}
	INIT_LIST_HEAD(&head->list);	
}

//单发(发给指定的人)
bool send_single(char *msg, unsigned short port)
{
   
   
	struct list_head *pos = NULL;
	struct client *tmp = NULL;
	
	list_for_each(pos, &head->list)
	{
   
   
		tmp =list_entry(pos, struct client, list);
		if(tmp->port == port)
		{
   
   
			write(tmp->confd, msg, strlen(msg));
			return true;
		}
	}
	return false;
}

//群发
void send_broadcast(char *msg, struct client* new)
{
   
   
	struct list_head *pos = NULL;
	struct client *tmp = NULL;

	list_for_each(pos, &head->list)
	{
   
   
		tmp =list_entry(pos, struct client, list);
		if(tmp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖小邓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值