第十一章 定时器
网络编程中定时器这种定时触发的工具非常重要,可以在某段时间之后触发某段代码,可以用各种数据结构对它们统一管理,这章主要介绍时间轮和时间堆。Linux提供三种定时方法:socket 选项 SO_RCVTIMEO和SO_SNDTIMEO、SIGALRM 信号、I/O复用系统调用的超时参数。
11.1 socket 选项 SO_RCVTIMEO 和 SO_SNDTIMEO
这两个选项设置了接收数据的超时时间和发送的超时时间。SO_SNDTIMEO:send、sendmsg,SO_RCVTIMEO:recv、recvmsg、accept。如果超时返回-1,errno为EAGAIN或者EWOULDBLOCK。connect可以设置SO_SNDTIMEO,就是非阻塞调用connect同时建立多个连接的一种方法,超时返回-1,errno为EINPROGRESS。
使用setsockopt更改套接字选项,struct timeval是时间单位,一旦满足超时条件就可以处理了,比如之前的非阻塞connect就可以用select查看是否连接了。
11.2 SIGALRM信号
先讲了一个简陋的基于升序链表的定时器。回调函数:说白了就是函数作为另一个函数的参数使用的方式,调用者的参数为指向函数的指针,而实参就是某个函数,这就是回调 ,其它都白扯。在epoll_wait取得监听时间时,加一个节点到计时链表上,
11.3 利用I/O复用的三个函数
利用select、poll和epoll来统一定时操作,不过需要不断更新定时参数,因为可能提前触发。用time(NULL)获取开始的时间和结束的时间,每次循环重置。
11.4 高性能定时器
时间轮,时间堆,适用范围很大,时间轮的每个槽是一个链表,