2011-05-09 78 views
5

我使用非阻塞套接字編程服務器和客戶端(fd_setsselect函數),並且一旦服務器關閉或關閉客戶端套接字,客戶端開始接收大量垃圾,直到它崩潰.. 我已經警告說,與select()工作時,一個插座將成爲可讀當連接被終止,但我怎麼能知道C套接字:當套接字關閉時避免垃圾

if(FD_ISSET(socket, &read)) 
{ 
} 

如果原因僅僅是常規數據或連接已經結束?

非常感謝!

回答

6

文件描述符集不會告訴你套接字是否關閉,只是您可能試圖從中讀取。當遠程端關閉連接時,套接字將變爲「可讀」。當您嘗試recv()時,返回值將爲0,表示套接字已關閉。總是檢查你的返回值。

+0

謝謝!所以,當套接字關閉時,recv()會返回0嗎?哈哈,這是如此明顯..非常感謝 – Lucas 2011-05-09 13:28:29

+0

@Lucas嗨!歡迎來到Stackoverflow。如果你對戴夫的回答感到滿意,我們鼓勵你接受它,也許可以提高它。乾杯! – Calvin1602 2011-05-09 13:43:54

+0

謝謝!我已經註冊,只要我得到一些代表點 – Lucas 2011-05-09 13:53:43

0

你將不得不使用poll代替(它也更靈活,因爲它不是由FD_SET的大小必然!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};