天天看點

shutdown()的man手冊

  • 英文小冊原文位址:​​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);      

參閱