自律 linux 第 36 天
昨天学习IO多路复用的时候使用的是select函数接口, select需要在应用层建立一个放套接字的表,然后传入内核中,再又内核将响应的套接字表传回应用层,这样耗费时间和资源,而且这个表只能存放最多1024个套接字,受限比较严重。而今天学习的是使用epoll函数接口来实现IO多路复用。
epoll与select相比较,是直接在内核创建的链表来存放套接字,调用epoll_create()函数就能创建一个存放套接字的,在内核中的链表,这样节约了大量的时间,还没有了1024的限制。epoll通过epoll_ctl()函数实现将套接字添加进套接字集合,或者从套接字集合中将其删除,只需要将epoll_ctl中的某个参数设置为EPOLL_CTL_ADD 或者 EPOLL_CTL_DEL就能实现对应功能。
然后使用epoll_wait()对套接字集合进行检测,若有客户端在发消息, epoll_wait()检测到之后就会返回需要响应的套接字个数的struct epoll_event类型的结构体,这些结构体中就有需要响应的套接字,根据这些套接字做出对应的接收消息或建立连接等操作即可。
今天实现了使用epoll实现TCP的多端通信,让多个客户端发送消息给服务端,服务端再将消息转发给其他客户端,实现一个群聊的效果,就是在epoll实现多端通信的基础上,将产生的通信套接字都放在一个数组中,然后接收某个客户端的消息后,在发消息的时候将消息发往其余的所以客户端。