2012-04-01 136 views
2

我的程序最多接受4個連接(使用select函數)。一旦他們連接,他們有5秒鐘發送一個字符串,表明他們想保持連接。那些在5秒內沒有發送,或者密碼錯誤的將被斷開。連接超時C

我創建了一個小型的定時器程序,當連接建立時這個程序就會分叉。如果5秒鐘消失,分叉計時器將發回一個信號給原始程序。在這種情況下,信號處理程序將關閉文件描述符,並清除連接。

我的問題是,無論何時觸發信號處理程序,select()返回-1,表示它失敗。有誰知道爲什麼會發生這種情況?或者如果有另一種時間機制我可以使用?

感謝

+1

當select返回-1時,errno是什麼?這是你最大的暗示。 – Duck 2012-04-01 04:17:17

回答

0

我相信這是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(); 
} 

是否幫助呢?

1

產卵而不是一個無用的線程,只保留每個插槽相關的lastRecvd場。然後,只需給予select() 5秒的超時時間。選擇後,任何不在選擇列表中的套接字將需要檢查它是否已經過5秒。

至於爲什麼它與您當前的代碼失敗,我懷疑這是因爲其中一個文件描述符被無效。檢查errno,看看它是否爲EBADF