網絡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時候的超時時間,但該參數不是對全部的系統都生效的

相關文章
相關標籤/搜索