- 英文小冊原文位址:beej.us/guide/bgnet…
- 作者:Beej
- 中文翻譯位址:www.chanmufeng.com/posts/netwo…
停止對socket繼續傳送與接受。
函數原型
#include <sys/socket.h>
int shutdown(int s, int how);
說明
如果我不需要再對 socket 進行
send()
了,但是我仍然想要
recv()
socket 的資料,反之亦然,那我該怎麼做呢?
當你使用
close()
關閉 socket descriptor 時,它會将 socket 的傳送與接收兩端都關閉,并且釋放 socket descriptor。若你隻想要關閉其中一端,你就可以使用
shutdown()
這個函數。
在這些參數中,
s
顯然是你想要進行動作的 socket,而要進行什麼樣的動作,則要由
how
參數指定。可以使用
SHUT_RD
來關閉接收,
SHUT_WR
以關閉傳送,或者
SHUT_RDWR
将收送功能都關閉。
-
SHUT_RD
關閉連接配接的讀功能,socket中不再有資料可以被接受,而且socket接收緩沖區中的先有資料都被丢棄。程序不能再對這樣的socket調用任何讀函數。
-
SHUT_WR
關閉連接配接的寫功能。目前留在socket發送緩沖區中的資料将被發送掉,後面跟着TCP的正常連接配接終止序列。程序不能再對這樣的socket調用任何寫函數。
-
SHUT_RDWR
連接配接的讀功能和寫功能都被關閉,這等于調用
兩次:第一次調用指定shutdown
,第二次調用指定SHUT_RD
。SHUT_WR
shutdown()
用來關閉連接配接,而不是socket,不管調用多少次
shutdown()
,socket依然存在,因為
shutdown()
并沒有釋放 socket descriptor,是以即使 socket 已經整個 shutdown 了,最終仍然得透過
close()
關閉 socket。
預設情況下,
close()
會立即向網絡中發送
FIN
包,不管輸出緩沖區中是否還有資料,而
shutdown()
會等輸出緩沖區中的資料傳輸完畢再發送
FIN
包。也就意味着,調用
close()
将丢失輸出緩沖區中的資料,而調用
shutdown()
不會。
傳回值
例子
int s = socket(PF_INET, SOCK_STREAM, 0);
// ...do some send()s and stuff in here...
// and now that we're done, don't allow any more sends()s:
shutdown(s, SHUT_WR);