狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

socket close()和shutdown()區(qū)別

admin
2017年4月14日 14:28 本文熱度 7936

shutdown() doesn''t actually close the file descriptor—it just changes its usability. To free a socket descriptor, you need to use close().

  • shutdown是一種優(yōu)雅地單方向或者雙方向關(guān)閉socket的方法。 而close則立即雙方向強(qiáng)制關(guān)閉socket并釋放相關(guān)資源。

  • 如果有多個進(jìn)程共享一個socket,shutdown影響所有進(jìn)程,而close只影響本進(jìn)程。

以下均基于單進(jìn)程socket。

服務(wù)端調(diào)用shutdown()

  • server調(diào)用shutdown(),此時任何后續(xù)的send,recv都是無效的(根據(jù)關(guān)閉發(fā)送還是關(guān)閉接收有所不同)。shutdown本身并不影響底層,也就是說,此前發(fā)出的異步send/recv不會返回。其次,在所有已發(fā)送的包被client確認(rèn)后,server會發(fā)送FIN包給client,開始TCP四次揮手過程。

  • 注意不管是關(guān)閉發(fā)送還是關(guān)閉接收,server端均向client端發(fā)送FIN報(bào)文。client 端收到FIN報(bào)文后,并不知道server端以何種方式shutdown,甚至不知道server端是shutdown還是close。

  • client端收到FIN報(bào)文之后,詳見下文敘述......

服務(wù)端調(diào)用close()

通過參數(shù)設(shè)置不同,調(diào)用close會出現(xiàn)如下A,B兩種情況:

A. 向客戶端發(fā)送一個RST報(bào)文,丟棄本地緩沖區(qū)的未讀數(shù)據(jù),關(guān)閉socket并釋放相關(guān)資源,此種方式為強(qiáng)制關(guān)閉。(l_onoff為非0,l_linger為0,)

B. 向客戶端發(fā)送一個FIN報(bào)文,收到client端FIN ACK后,進(jìn)入了FIN_WAIT_2階段,可參考TCP四次揮手過程,此種方式為優(yōu)雅關(guān)閉。如果在l_linger的時間內(nèi)仍未完成四次揮手,則強(qiáng)制關(guān)閉。( l_onoff 為非0,l_linger為非0)

FIN與RST

  • 若server端發(fā)送FIN報(bào)文后沒有收到client端的FIN ACK,會兩次重傳FIN報(bào)文,若一直收不到client端的FIN ACK,則會給client端發(fā)送RST信號,關(guān)閉socket并釋放資源。(不同系統(tǒng)實(shí)現(xiàn)可能會不同)

  • client收到FIN信號后,再調(diào)用read函數(shù)會返回0。因?yàn)镕IN的接收,表明client端以后再無數(shù)據(jù)可以接收,對方發(fā)來FIN,表明對方不在發(fā)送數(shù)據(jù)了。

(注意所有FIN及ACK報(bào)文均由操作系統(tǒng)自動完成發(fā)送接收)

  • client收到FIN后,會發(fā)送應(yīng)答ack報(bào)文,表明收到server的FIN報(bào)文,server收到ack報(bào)文之后,就進(jìn)入了FIN_WAIT_2階段。

  • 根據(jù)tcp協(xié)議,向一個 FIN_WAIT2 狀態(tài)的 TCP寫入數(shù)據(jù)是沒有問題的,所以此時client可以調(diào)用write函數(shù),寫入到發(fā)送緩沖區(qū),并由tcp連接,發(fā)送到server的接收緩沖區(qū)。由于server端已經(jīng)關(guān)閉了socket,所以此時的server接收緩沖區(qū)的內(nèi)容都被拋棄,同時server端返回RST給客戶端。

  • client端如何知道已經(jīng)接收到RST報(bào)文?

server發(fā)送RST報(bào)文后,并不等待從client端接收任何ack響應(yīng),直接關(guān)閉socket。而client端收到RST報(bào)文后,也不會產(chǎn)生任何響應(yīng)。client端收到RST報(bào)文后,程序行為如下:

  1. 阻塞模型下,內(nèi)核無法主動通知應(yīng)用層出錯,只有應(yīng)用層主動調(diào)用read()或者write()這樣的IO系統(tǒng)調(diào)用時,內(nèi)核才會利用出錯來通知應(yīng)用層對端已經(jīng)發(fā)送RST報(bào)文。
  2. 非阻塞模型下,select或者epoll會返回sockfd可讀,應(yīng)用層對其進(jìn)行讀取時,read()會報(bào)RST錯誤。

通過read write函數(shù)出錯返回后,獲取errno來確定對端是否發(fā)送RST信號。

  • client收到RST報(bào)文后應(yīng)如何處理?

client端收到RST信號后,如果調(diào)用read函數(shù)讀取,則會返回RST錯誤。在已經(jīng)產(chǎn)生RST錯誤的情況下,繼續(xù)調(diào)用write,則會發(fā)生epipe錯誤。此時內(nèi)核將向客戶進(jìn)程發(fā)送 SIGPIPE 信號,該信號默認(rèn)會使進(jìn)程終止,通常程序會異常退出(未處理SIGPIPE信號的情況下)。

在收到server發(fā)送RST報(bào)文的情況下,client端的任何read write都是毫無意義的。


該文章在 2017/4/14 14:28:33 編輯過

全部評論1

admin
2017年4月14日 14:30
socket關(guān)閉有2個close,shutdown 他們之間的區(qū)別: close-----關(guān)閉本進(jìn)程的socket id,但鏈接還是開著的,用這個socket id的其它進(jìn)程還能用這個鏈接,能讀或?qū)戇@個socket id shutdown--則破壞了socket 鏈接,讀的時候可能偵探到EOF結(jié)束符,寫的時候可能會收到一個SIGPIPE信號,這個信號可能直到 socket buffer被填充了才收到,shutdown還有一個關(guān)閉方式的參數(shù),0 不能再讀,1不能再寫,2 讀寫都不能。 =============================================================================================================== socket 多進(jìn)程中的shutdown, close使用 當(dāng)所有的數(shù)據(jù)操作結(jié)束以后,你可以調(diào)用close()函數(shù)來釋放該socket,從而停止在該socket上的任何數(shù)據(jù)操作: close(sockfd); 你也可以調(diào)用shutdown()函數(shù)來關(guān)閉該socket。該函數(shù)允許你只停止在某個方向上的數(shù)據(jù)傳輸,而一個方向上的數(shù)據(jù)傳輸繼 續(xù)進(jìn)行。如你可以關(guān)閉某socket的寫操作而允許繼續(xù)在該socket上接受數(shù)據(jù),直至讀入所有數(shù)據(jù)。 int shutdown(int sockfd,int how); Sockfd是需要關(guān)閉的socket的描述符。參數(shù) how允許為shutdown操作選擇以下幾種方式: SHUT_RD:關(guān)閉連接的讀端。也就是該套接字不再接受數(shù)據(jù),任何當(dāng)前在套接字接受緩沖區(qū)的數(shù)據(jù)將被丟棄。進(jìn)程將不能對該 套接字發(fā)出任何讀操作。對TCP套接字該調(diào)用之后接受到的任何數(shù)據(jù)將被確認(rèn)然后無聲的丟棄掉。 SHUT_WR:關(guān)閉連接的寫端,進(jìn)程不能在對此套接字發(fā)出寫操作 SHUT_RDWR:相當(dāng)于調(diào)用shutdown兩次:首先是以SHUT_RD,然后以SHUT_WR 使用close中止一個連接,但它只是減少描述符的參考數(shù),并不直接關(guān)閉連接,只有當(dāng)描述符的參考數(shù)為0時才關(guān)閉連接。 shutdown可直接關(guān)閉描述符,不考慮描述符的參考數(shù),可選擇中止一個方向的連接。 注意: 1>. 如果有多個進(jìn)程共享一個套接字,close每被調(diào)用一次,計(jì)數(shù)減1,直到計(jì)數(shù)為0時,也就是所用進(jìn)程都調(diào)用了close,套 接字將被釋放。 2>. 在多進(jìn)程中如果一個進(jìn)程中shutdown(sfd, SHUT_RDWR)后其它的進(jìn)程將無法進(jìn)行通信. 如果一個進(jìn)程close(sfd)將不會 影響到其它進(jìn)程. 得自己理解引用計(jì)數(shù)的用法了. 有Kernel編程知識的更好理解了. 以上為轉(zhuǎn)載文章,后面?zhèn)€人的理解一般在開發(fā)過程中,應(yīng)該是先close(),如果close()失敗才再去調(diào)用shutdown()操作,如果shutdown()再失敗,一般這個情況的時候就不是一般的錯誤發(fā)生了,對于這種錯誤就涉及到操作系統(tǒng)內(nèi)核級的錯誤了,所以應(yīng)用程序開發(fā)到這一級就足以。 要注意的是,雖然shutdown()提供了讀寫分別關(guān)閉的操作,但是它是影響到所有的進(jìn)程的,所以需要注意。

該評論在 2017/4/14 14:30:28 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved