網絡IO超時的幾種實現


一、select/poll/epoll

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

timeout為等待的指定時間,當有描述符符合條件  或是  超過超時時間的話,函數返回,可以利用timeout完成超時的判斷

 

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

timeout為等待的指定時間,當有描述符符合條件  或是  超過超時時間的話,函數返回,可以利用timeout完成超時的判斷

 

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

timeout為等待的指定時間,當有描述符符合條件  或是  超過超時時間的話,函數返回,可以利用timeout完成超時的判斷

示例 使用epoll時的nginx

NewImage

timer為最早一個超時的事件的超時值,或為一個默認值

NewImage

 

二、libcurl庫提供的超時配置

curl_easy_setopt(xxx, CURLOPT_CONNECTTIMEOUT_MS, yyy );嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。
curl_easy_setopt(xxx, CURLOPT_TIMEOUT_MS,yyy );   設置cURL允許執行的最長毫秒數

 

 

三、alarm/setitimer

通過指定間隔時間發出SIGALRM信號,在檢查是否有時間超時

示例:

nginx定時器

NewImage

nginx提供了利用settimer每隔一段時間 喚起epoll_wait,在檢查是否有時間超時的方式,避免了頻繁調用gettimeofday的系統函數

 

 

四、利用recv/send提供的超時參數配置

setsockopt 可以對socket句柄設置各種參數,其中包括了SO_SNDTIMEO, SO_RCVTIMEO兩個選擇,他們可以控制使用recv, send時候的超時時間,但該參數不是對所有的系統都生效的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM