2013-01-19 176 views
2

我有一個正在等待TCP連接的pselect運行。那pselect正在自己的線程中運行,因此我有一堆運行。TCP套接字永遠不會關閉

我在這些pselect上設置了一個超時時間,但是,當我運行sockstat時,我有一些永遠不會關閉的連接。其中99%是。當我關閉完全建立連接的客戶端時,我認爲在超時之後,我可以關閉這些套接字。我已經把斷點檢查爲零的返回值,但它從來沒有發生。

在僞這就是我

if((ret == pselect(..., timeout, NULL) <0){ 
//check errors 
} else if (ret == 0) 
{ 
//close connection for timing out 
//I never land here, even though I can close the client side (thus presumably closing the connection) 
} 

還有什麼我可以做調試,如果這是我的問題嗎?我很難確切地知道哪個socket fd被打開了,儘管我可以在sockstat中看到它們。

回答

2

由於從另一端關閉的套接字都是可讀寫的,因此您的線程可能在(未包括的)else情況下旋轉。爲了進入超時狀態,你希望保持另一端在超時時間內打開。

(你所處的情況是POLLHUPpoll()而言)

+0

我看到...我會給這個try..I也有一些其他的別的塊來檢查FD的中集,但我不認爲我只是有一個捕獲所有其他 – Derek

+0

@Derek:你不需要一個全面的'else',只是在你顯示的其他一些子句中,你會看到一個遠程關閉的套接字在讀取集合和'recv'將返回'ECONNRESET'。 –

+0

如果對等方斷開,它將返回零。 – EJP