2012-08-11 109 views

回答

2

只是close(2)文件描述符並停止讀取它。

+0

但是,如果服務器關閉文件描述符的客戶端,客戶端將不會終止,直到對服務器的文件描述符進行下一個操作(寫入失敗時)。當服務器踢他時,我會立即終止客戶端 – giozh 2012-08-11 09:34:47

+1

@giozh實際上,當套接字關閉時,客戶端的套接字將變得可讀,下一次調用read或recv將返回零,這表示一個乾淨的關閉從另一側。 – 2012-08-11 09:35:58

+2

@giozh在TCP術語中,沒有「踢」之類的東西。你可以只聲明你不會再發送任何東西;客戶可以自由地保持一面開放。 – cnicutar 2012-08-11 09:36:18

0

術語含糊不清。您通常可以通過啓用SO_LINGER選項(超出0)來強制服務器TCP堆棧重置連接,然後關閉套接字。下面的例子(沒有錯誤檢查)。

struct linger lo = { 1, 0 }; 
setsockopt(sock, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo)); 
shutdown(sock, SHUT_RDWR); 
close(sock); 

,如果你有一定的sock沒有被複制到shutdown顯式調用是沒有必要的。