-1
有一種簡單的方法來在發生超時時從服務器踢出客戶端?插座是TCP從服務器踢一個客戶端
有一種簡單的方法來在發生超時時從服務器踢出客戶端?插座是TCP從服務器踢一個客戶端
只是close(2)
文件描述符並停止讀取它。
術語踢含糊不清。您通常可以通過啓用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
顯式調用是沒有必要的。
但是,如果服務器關閉文件描述符的客戶端,客戶端將不會終止,直到對服務器的文件描述符進行下一個操作(寫入失敗時)。當服務器踢他時,我會立即終止客戶端 – giozh 2012-08-11 09:34:47
@giozh實際上,當套接字關閉時,客戶端的套接字將變得可讀,下一次調用read或recv將返回零,這表示一個乾淨的關閉從另一側。 – 2012-08-11 09:35:58
@giozh在TCP術語中,沒有「踢」之類的東西。你可以只聲明你不會再發送任何東西;客戶可以自由地保持一面開放。 – cnicutar 2012-08-11 09:36:18