我正在寫一個非分岔服務器,使用poll()進行多個同時連接。它工作正常,除了我有問題如何檢測超時正確的方式。如何使用poll()檢測超時客戶端?
比方說,我有以下代碼:
#define POLL_SIZE 512
struct pollfd poll_set[POLL_SIZE];
timeout = 60000; // 60 secs
// setup server_sockfd with socket(), bind(), listen(), ...
poll_set[0].fd = server_sockfd;
poll_set[0].events = POLLIN;
numfds = 1;
while(1) {
rc = poll(poll_set, numfds, timeout);
if(rc == 0){
// handle timeout
}
for(fd_index = 0; fd_index < numfds; fd_index++) {
if(poll_set[fd_index].revents & POLLIN) {
// accept new connection or handle established connections
}
}
}
假設,我有15個客戶端連接,14個客戶端發送和接收數據,但一個客戶是沉默,沒有數據或者從,即。只需佔用服務器上的一個套接字即可。現在
,問題是,民意調查()不能當場這個特定的客戶端,因爲所有其他14個客戶端提供數據,所以民調()說,它的確定。
你將如何通過檢測這個沉默的客戶解決了這個問題,並關閉它的連接?
目前,我還沒有更好的,然後創建一個time_t lastseen [POLL_SIZE]數組,並且當從客戶端讀取數據或發送到客戶端時跟蹤給定連接的時間戳。
然後我在每60秒,使用報警信號,並通過lastseen陣列運行時,比較其與當前時間戳的時間戳,和拆除每個連接爲空閒> 60秒。
或許一個線程可以做,以避免信號是相同的。你有什麼建議來解決這個問題?
(請注意,我嘗試用libevent的,這是非常好的。但是,我不得不放棄,因爲我找不到支持SSL/TLS添加到已經連接的套接字。想想STARTTLS的)
謝謝梅德,然後我會跟蹤給定的插座自己的時間戳。比 –
感謝與clock_gettime的提示。順便說一句。儘管我開發的軟件主要在Linux上運行,但我仍想繼續支持其他操作系統(例如Freebsd等)支持民意測驗。 –