shutdown vs close

shutdown 和 close關閉tcp鏈接的介紹網上有不少,主要區別以下:html

一、調用close後,將停止通訊、刪除套接字、丟棄數據。可是,注意嘍,可是,若是有多個進程共享一個套接字,close每被調用一次,計數減1,直到計數爲0時,也就是所用進程都調用了close,套接字將被釋放socket

二、close 關閉了自身數據傳輸的兩個方向(當引用數爲0)。tcp

三、shutdown可直接關閉描述符,不考慮描述符的引用數,可選擇停止一個方向的鏈接。測試

但當調用close或者shutdown時在系統底層發生了什麼了?google

通過google和測試得出結論以下:.net

一、調用close(引用數爲0),tcp協議棧發送fin消息給對端;3d

二、調用shutdown(fd, SHUT_RDWR)同close,但不計多個進程引用數,直接關閉;unix

三、調用shutdown(fd, SHUT_RD), 使阻塞的read(fd,)馬上返回0;不發送fin消息;htm

以下圖所示:每read一次sleep(1); 10s後對端發送消息,仍是能夠讀到的,只是否是使read阻塞。blog

四、調用shutdown(fd, SHUT_WR),發送fin消息給對端,但仍可接收對端消息;

http://bbs.chinaunix.net/thread-2178020-1-1.html

http://stackoverflow.com/questions/740817/behavior-of-shutdownsock-shut-rd-with-tcp

http://stackoverflow.com/questions/4160347/close-vs-shutdown-socket

相關文章
相關標籤/搜索