shutdown和close的區別

2021-06-06 07:14:20 字數 813 閱讀 1381

當所有的資料操作結束以後,你可以呼叫close()函式來釋放該socket,從而停止在該socket上的任何資料操作:

close(sockfd);

你也可以呼叫shutdown()函式來關閉該socket。該函式允許你只停止在某個方向上的資料傳輸,而乙個方向上的資料傳輸繼續進行。如你可以關 閉某socket的寫操作而允許繼續在該socket上接受資料,直至讀入所有資料。

int shutdown(int sockfd,int how);

sockfd是需要關閉的socket的描述符。引數 how允許為shutdown操作選擇以下幾種方式:

shut_rd:關閉連線的讀端。也就是該套接字不再接受資料,任何當前在套接字接受緩衝區的資料將被丟棄。程序將不能對該套接字發出任何讀操作。對 tcp套接字該呼叫之後接受到的任何資料將被確認然後無聲的丟棄掉。

shut_wr:關閉連線的寫端,程序不能在對此套接字發出寫操作

shut_rdwr:相當於呼叫shutdown兩次:首先是以shut_rd,然後以shut_wr

使用close中止一 個連線,但它只是減少描述符的參考數,並不直接關閉連線,只有當描述符的參考數為0時才關閉連線。

shutdown可直接關閉描述符,不考慮描述 符的參考數,可選擇中止乙個方向的連線。

注意:1>. 如果有多個程序共享乙個套接字,close每被呼叫一次,計數減1,直到計數為0時,也就是所用程序都呼叫了close,套接字將被釋放。

2>. 在多程序中如果乙個程序中shutdown(sfd, shut_rdwr)後其它的程序將無法進行通訊. 如果乙個程序close(sfd)將不會影響到其它程序. 得自己理解引用計數的用法了

close和shutdown函式的區別

close函式首先是將傳入的socket控制代碼引用數減1 因為fork程序時會導致socket控制代碼被多個程序引用 待到引用數等於0的時候,close才會真正關閉連線。shutdown函式是立刻關閉連線 忽視控制代碼引用數值 關閉有三種方式 shut rd 關閉呼叫程序的讀通道,呼叫程序立刻不能...

close與shutdown的區別

終止網路連線的通常方法是呼叫close函式。不過close有兩個限制,卻可以使用shutdown來避免。1 close把描述字的引用計數減1,僅在該計數變為0的時候才關閉套介面。而使用shutdown可以不管引用計數的值是多少就激發tcp的正常連線終止序列,也即是傳送fin節。2 close終止資料...

socket shutdown和close的區別

shutdown doesn t actually close the file descriptor it just changes its usability.to free a socket descriptor,you need to use close 以下均基於單程序socket。服務端...