网络IO超时的几种实现

1、select/poll/epollnginx

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);curl

timeout为等待的指定时间,当有描述符符合条件  或是  超过超时时间的话,函数返回,能够利用timeout完成超时的判断socket

 

int poll ( struct pollfd * fds, unsigned int nfds, int timeout);函数

timeout为等待的指定时间,当有描述符符合条件  或是  超过超时时间的话,函数返回,能够利用timeout完成超时的判断url

 

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);spa

timeout为等待的指定时间,当有描述符符合条件  或是  超过超时时间的话,函数返回,能够利用timeout完成超时的判断code

示例 使用epoll时的nginxorm

NewImage

timer为最先一个超时的事件的超时值,或为一个默认值blog

NewImage

 

2、libcurl库提供的超时配置事件

curl_easy_setopt(xxx, CURLOPT_CONNECTTIMEOUT_MS, yyy );尝试链接等待的时间,以毫秒为单位。若是设置为0,则无限等待。
curl_easy_setopt(xxx, CURLOPT_TIMEOUT_MS,yyy );   设置cURL容许执行的最长毫秒数

 

 

3、alarm/setitimer

经过指定间隔时间发出SIGALRM信号,在检查是否有时间超时

示例:

nginx定时器

NewImage

nginx提供了利用settimer每隔一段时间 唤起epoll_wait,在检查是否有时间超时的方式,避免了频繁调用gettimeofday的系统函数

 

 

4、利用recv/send提供的超时参数配置

setsockopt 能够对socket句柄设置各类参数,其中包括了SO_SNDTIMEO, SO_RCVTIMEO两个选择,他们能够控制使用recv, send时候的超时时间,但该参数不是对全部的系统都生效的

相关文章
相关标签/搜索