1樓:匿名使用者
一、指代不同
1、shutdown() :是指禁止在一個套介面上進行資料的接收與傳送。
2、close():關閉一個套介面。更確切地說,它釋放套介面描述字s,以後對s的訪問均以wsaenotsock錯誤返回。
二、原理不同
1、shutdown() :how引數為0,則該套介面上的後續接收操作將被禁止。這對於低層協議無影響。
對於tcp協議,tcp視窗不改變並接收前來的資料(但不確認)直至視窗滿。對於udp協議,接收並排隊前來的資料。任何情況下都不會產生icmp錯誤包。
2、close():為對套介面的最後一次訪問,則相應的名字資訊及資料佇列都將被釋放。closesocket()的語義受so_linger與so_dontlinger選項影響。
三、特點不同
1、shutdown() :一個應用程式不應依賴於重用一個已被shutdown()禁止的套介面。特別地,一個windows套介面實現不必支援在這樣的套介面上使用connect()呼叫。
2、close():如無錯誤發生,則closesocket()返回0。否則的話,返回socket_error錯誤,應用程式可通過wsagetlasterror()獲取相應錯誤**。
2樓:匿名使用者
下面說說close和shutdown兩個函式的差別,兩個函式在網路程式設計中都被人為是來關閉套接字的,差別如下:
1.操作本質不同
close是檔案系統vfs的一個通用函式
shutdown是專門針對socket套接字設立的函式
socket在unix中本就是以檔案的形式呈現給大家的,在每建立一個socket時,會對應建立一個檔案與之對應,返回檔案描述符,
具體的結構在此不詳述,在呼叫close時實際是關閉了減少了檔案描述符,當檔案描述符引用為0時,則會刪除檔案,關閉套接字。
而shutdown是直接對socket的操作,相當於設定了socket的屬性,可以設定為只讀,只寫,或者直接關閉,但不會操作與此socket相關
的檔案2.兩者操作的效果一同
close的操作跟設定選項linger有關,此選項是設定當使用者呼叫close後是否等待把當前緩衝區的資料傳送完畢後再關閉套接字
linger結構有兩個值,一個是on,一個是time
當on為0時,預設情況,使用者傳送完分組,然後傳送fin分組
當on為1時,time為0,則使用者直接傳送rst分組
當on為1時,time為非0,則使用者等待time值然後傳送fin分組,如果time到了但使用者沒有傳送完資料,則返回錯誤ewouldblock
shutdown
shut_rd,套接字不能再發出接收請求,程序仍然可以往套接字傳送資料,套接字接收緩衝區中所有資料被丟棄,再接收到的任何資料由tcp丟棄,對套接字傳送緩衝區沒有任何影響
shut_wd ,套接字不能再發出傳送請求,套接字傳送緩衝區的資料將被髮送到對端,然後跟著正常的fin終止序列
3樓:幸巴達
close是關閉連線並釋放資源。 而shutdown只是關閉傳送或者接收或者兩者,而並不是關閉連線。
具體參考
4樓:
當所有的資料操作結束以後,你可以呼叫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)將不會影響到其它程序.
得自己理解引用計數的用法了
網路程式設計中阻塞和非阻塞socket的區別
阻塞阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有資料,...
socket程式設計傳輸資料和網速關係大嗎
樹大沒風 傳輸速度和傳輸穩定性當然受影響了,就像你上網時候,網速不好時候不就經常卡,一樣的道理啊,都是udp或者tcp,icmp等方式傳輸,網路不好就會傳輸慢或者丟包 上網速度快慢與電腦或手機硬體不是沒有關係,但是關係不大。上網速度的快慢主要與下述因素有關 一是傳輸介質 二是傳輸速率。現在主幹網的介...
socket程式設計,獲得客戶端埠號問題
因為內網主機向外網傳送請求,會經過路由器,路由器會進行 如 路由器公網ip 188.188.188.188你的內網ip 192.168.1.8 若你發起請求 192.168.1.8 8970 對方ip 埠路由器收到後會記錄你的內網ip和埠 建立路由表 並啟用新的埠請求對方 實際可能是 188.188...