我使用非阻塞套接字編程服務器和客戶端(fd_sets
和select
函數),並且一旦服務器關閉或關閉客戶端套接字,客戶端開始接收大量垃圾,直到它崩潰.. 我已經警告說,與select()
工作時,一個插座將成爲可讀當連接被終止,但我怎麼能知道C套接字:當套接字關閉時避免垃圾
if(FD_ISSET(socket, &read))
{
}
如果原因僅僅是常規數據或連接已經結束?
非常感謝!
我使用非阻塞套接字編程服務器和客戶端(fd_sets
和select
函數),並且一旦服務器關閉或關閉客戶端套接字,客戶端開始接收大量垃圾,直到它崩潰.. 我已經警告說,與select()
工作時,一個插座將成爲可讀當連接被終止,但我怎麼能知道C套接字:當套接字關閉時避免垃圾
if(FD_ISSET(socket, &read))
{
}
如果原因僅僅是常規數據或連接已經結束?
非常感謝!
文件描述符集不會告訴你套接字是否關閉,只是您可能試圖從中讀取。當遠程端關閉連接時,套接字將變爲「可讀」。當您嘗試recv()
時,返回值將爲0,表示套接字已關閉。總是檢查你的返回值。
你將不得不使用poll
代替(它也更靈活,因爲它不是由FD_SET的大小必然!)
struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
謝謝!所以,當套接字關閉時,recv()會返回0嗎?哈哈,這是如此明顯..非常感謝 – Lucas 2011-05-09 13:28:29
@Lucas嗨!歡迎來到Stackoverflow。如果你對戴夫的回答感到滿意,我們鼓勵你接受它,也許可以提高它。乾杯! – Calvin1602 2011-05-09 13:43:54
謝謝!我已經註冊,只要我得到一些代表點 – Lucas 2011-05-09 13:53:43