我的程序最多接受4個連接(使用select函數)。一旦他們連接,他們有5秒鐘發送一個字符串,表明他們想保持連接。那些在5秒內沒有發送,或者密碼錯誤的將被斷開。連接超時C
我創建了一個小型的定時器程序,當連接建立時這個程序就會分叉。如果5秒鐘消失,分叉計時器將發回一個信號給原始程序。在這種情況下,信號處理程序將關閉文件描述符,並清除連接。
我的問題是,無論何時觸發信號處理程序,select()返回-1,表示它失敗。有誰知道爲什麼會發生這種情況?或者如果有另一種時間機制我可以使用?
感謝
我的程序最多接受4個連接(使用select函數)。一旦他們連接,他們有5秒鐘發送一個字符串,表明他們想保持連接。那些在5秒內沒有發送,或者密碼錯誤的將被斷開。連接超時C
我創建了一個小型的定時器程序,當連接建立時這個程序就會分叉。如果5秒鐘消失,分叉計時器將發回一個信號給原始程序。在這種情況下,信號處理程序將關閉文件描述符,並清除連接。
我的問題是,無論何時觸發信號處理程序,select()返回-1,表示它失敗。有誰知道爲什麼會發生這種情況?或者如果有另一種時間機制我可以使用?
感謝
我相信這是select()
的預期行爲:返回-1與errno適當地設置,如果信號發生。
我不認爲線程是去這裏的路。我想,你希望一個程序大致是這樣的結構(原諒了Java式的命名,但你明白了吧):
int fdsThatResponded[FDCOUNT];
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT);
while (time_elapsed < 5) {
ret = select(......);
if (-1 == ret) {
handleError();
}
checkWhichFdAndHandleAppropriately();
reinitializeTimerForSelectWithRemainingTime();
}
是否幫助呢?
產卵而不是一個無用的線程,只保留每個插槽相關的lastRecvd
場。然後,只需給予select()
5秒的超時時間。選擇後,任何不在選擇列表中的套接字將需要檢查它是否已經過5秒。
至於爲什麼它與您當前的代碼失敗,我懷疑這是因爲其中一個文件描述符被無效。檢查errno
,看看它是否爲EBADF
。
當select返回-1時,errno是什麼?這是你最大的暗示。 – Duck 2012-04-01 04:17:17