socket關閉close和shutdown
socket關閉有2個close,shutdown
他們之間的區別:
close-----關閉本程序的socket id,但鏈結還是開著的,用這個socket id的其它程序還能用這個鏈結,能讀或寫這個socket id
shutdown--則破壞了socket 鏈結,讀的時候可能偵探到eof結束符,寫的時候可能會收到乙個sigpipe訊號,這個訊號可能直到
socket buffer被填充了才收到,shutdown還有乙個關閉方式的引數,0 不能再讀,1不能再寫,2 讀寫都不能。
socket 多程序中的shutdown, close使用
當所有的資料操作結束以後,你可以呼叫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)將不會
影響到其它程序. 得自己理解引用計數的用法了. 有kernel程式設計知識的更好理解了.
同事發現的該問題, 認為很重要就記下了!
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。服務端...
selenium之 關閉視窗close與quit
selenium關閉視窗有兩個方法,close與quit,我們稍作研究便知道這兩個方法的區別。這是close 的說明 closes the current window.關閉當前視窗。這是quit 的說明 quits the driver and closes every associated wi...
優雅的關閉socket
我們在利用iocp 完成埠 進行程式設計的時候,經常要關閉一些不滿足條件的套接字。假如我們直接採用closesocket方法進行關閉的話,繫結到io埠的此套接字的未傳送的資料就會丟失,這種情況是我們不願意發生的。下面介紹一種合理關閉此套接字的方法 首先,利用setsockopt msdn 函式設定套...