[socket編程-優(yōu)雅的斷開連接shutdown]

調用 close()/closesocket() 函數意味著完全斷開連接澈灼,即不能發(fā)送數據也不能接收數據,這種“生硬”的方式有時候會顯得不太“優(yōu)雅”序攘。


圖1:close()/closesocket() 斷開連接

上圖演示了兩臺正在進行雙向通信的主機抱婉。主機A發(fā)送完數據后,單方面調用 close()/closesocket() 斷開連接瓶佳,之后主機A芋膘、B都不能再接受對方傳輸的數據。實際上霸饲,是完全無法調用與數據收發(fā)有關的函數为朋。

一般情況下這不會有問題,但有些特殊時刻贴彼,需要只斷開一條數據傳輸通道潜腻,而保留另一條。

使用 shutdown() 函數可以達到這個目的器仗,它的原型為:

int shutdown(int sock, int howto); //Linux
int shutdown(SOCKET s, int howto); //Windows

sock 為需要斷開的套接字融涣,howto 為斷開方式童番。

howto 在 Linux 下有以下取值:

  • SHUT_RD:斷開輸入流。套接字無法接收數據(即使輸入緩沖區(qū)收到數據也被抹去)威鹿,無法調用輸入相關函數剃斧。
  • SHUT_WR:斷開輸出流。套接字無法發(fā)送數據忽你,但如果輸出緩沖區(qū)中還有未傳輸的數據幼东,則將傳遞到目標主機。
  • SHUT_RDWR:同時斷開 I/O 流科雳。相當于分兩次調用 shutdown()根蟹,其中一次以 SHUT_RD 為參數,另一次以 SHUT_WR 為參數糟秘。

howto 在 Windows 下有以下取值:

  • SD_RECEIVE:關閉接收操作简逮,也就是斷開輸入流。
  • SD_SEND:關閉發(fā)送操作尿赚,也就是斷開輸出流散庶。
  • SD_BOTH:同時關閉接收和發(fā)送操作。

至于什么時候需要調用 shutdown() 函數凌净,下節(jié)我們會以文件傳輸為例進行講解悲龟。

close()/closesocket()和shutdown()的區(qū)別##

確切地說,close() / closesocket() 用來關閉套接字冰寻,將套接字描述符(或句柄)從內存清除须教,之后再也不能使用該套接字,與C語言中的 fclose() 類似性雄。應用程序關閉套接字后没卸,與該套接字相關的連接和緩存也失去了意義羹奉,TCP協議會自動觸發(fā)關閉連接的操作秒旋。

shutdown() 用來關閉連接,而不是套接字诀拭,不管調用多少次 shutdown()迁筛,套接字依然存在,直到調用 close() / closesocket() 將套接字從內存清除耕挨。

調用 close()/closesocket() 關閉套接字時细卧,或調用 shutdown() 關閉輸出流時,都會向對方發(fā)送 FIN 包筒占。FIN 包表示數據傳輸完畢贪庙,計算機收到 FIN 包就知道不會再有數據傳送過來了。

默認情況下翰苫,close()/closesocket() 會立即向網絡中發(fā)送FIN包止邮,不管輸出緩沖區(qū)中是否還有數據这橙,而shutdown() 會等輸出緩沖區(qū)中的數據傳輸完畢再發(fā)送FIN包。也就意味著导披,調用 close()/closesocket() 將丟失輸出緩沖區(qū)中的數據屈扎,而調用 shutdown() 不會。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末撩匕,一起剝皮案震驚了整個濱河市鹰晨,隨后出現的幾起案子,更是在濱河造成了極大的恐慌止毕,老刑警劉巖模蜡,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異扁凛,居然都是意外死亡哩牍,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門令漂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝昆,“玉大人,你說我怎么就攤上這事叠必〖苑酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵纬朝,是天一觀的道長收叶。 經常有香客問我,道長共苛,這世上最難降的妖魔是什么判没? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮隅茎,結果婚禮上澄峰,老公的妹妹穿的比我還像新娘。我一直安慰自己辟犀,他們只是感情好俏竞,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堂竟,像睡著了一般魂毁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上出嘹,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天席楚,我揣著相機與錄音,去河邊找鬼税稼。 笑死烦秩,一個胖子當著我的面吹牛刁赦,可吹牛的內容都是我干的。 我是一名探鬼主播闻镶,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甚脉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铆农?” 一聲冷哼從身側響起牺氨,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墩剖,沒想到半個月后猴凹,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡岭皂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年郊霎,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爷绘。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡书劝,死狀恐怖,靈堂內的尸體忽然破棺而出土至,到底是詐尸還是另有隱情购对,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布陶因,位于F島的核電站骡苞,受9級特大地震影響,放射性物質發(fā)生泄漏楷扬。R本人自食惡果不足惜解幽,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烘苹。 院中可真熱鬧躲株,春花似錦、人聲如沸螟加。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捆探。三九已至,卻和暖如春站粟,著一層夾襖步出監(jiān)牢的瞬間黍图,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工奴烙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留助被,地道東北人剖张。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像揩环,于是被迫代替她去往敵國和親搔弄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • 1丰滑、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)顾犹、netstat -nat 查看TCP各個狀態(tài)的數量2)、lso...
    北辰青閱讀 9,423評論 0 11
  • 最近在看《UNIX網絡編程 卷1》和《FREEBSD操作系統(tǒng)設計與實現》這兩本書褒墨,我重點關注了TCP協議相關的內容...
    腩啵兔子閱讀 1,167評論 0 7
  • 非原創(chuàng)文章炫刷,網絡收集,如遇原作者郁妈,請私聊會標明出處浑玛! 1--11 tcp協議中三次握手和四次揮手建立TCP需要三次...
    Juinjonn閱讀 2,160評論 0 28
  • 大理曾經是我夢想中的烏托邦,曾經我覺得在這里人生是可以被凈化的噩咪,看看蒼山那頭飄來的云顾彰,去洱海邊釣釣魚,偶爾在陽光...
    4U閱讀 389評論 0 3
  • WhiteRice米飯閱讀 318評論 0 0