//以下代码仅供参考,如有错误请评论指正,谢谢!
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

最低0.47元/天 解锁文章
953

被折叠的 条评论
为什么被折叠?



