日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shutdown()函数:优雅地断开TCP连接

發(fā)布時間:2025/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shutdown()函数:优雅地断开TCP连接 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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


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


上圖演示了兩臺正在進(jìn)行雙向通信的主機(jī)。主機(jī)A發(fā)送完數(shù)據(jù)后,單方面調(diào)用?close()/closesocket() 斷開連接,之后主機(jī)A、B都不能再接受對方傳輸?shù)臄?shù)據(jù)。實(shí)際上,是完全無法調(diào)用與數(shù)據(jù)收發(fā)有關(guān)的函數(shù)。

一般情況下這不會有問題,但有些特殊時刻,需要只斷開一條數(shù)據(jù)傳輸通道,而保留另一條。

使用 shutdown() 函數(shù)可以達(dá)到這個目的,它的原型為:

?
  • int shutdown(int sock, int howto); //Linux
  • int shutdown(SOCKET s, int howto); //Windows
  • sock 為需要斷開的套接字,howto 為斷開方式。

    howto 在 Linux 下有以下取值:

    • SHUT_RD:斷開輸入流。套接字無法接收數(shù)據(jù)(即使輸入緩沖區(qū)收到數(shù)據(jù)也被抹去),無法調(diào)用輸入相關(guān)函數(shù)。
    • SHUT_WR:斷開輸出流。套接字無法發(fā)送數(shù)據(jù),但如果輸出緩沖區(qū)中還有未傳輸?shù)臄?shù)據(jù),則將傳遞到目標(biāo)主機(jī)。
    • SHUT_RDWR:同時斷開 I/O 流。相當(dāng)于分兩次調(diào)用 shutdown(),其中一次以 SHUT_RD 為參數(shù),另一次以 SHUT_WR 為參數(shù)。


    howto 在 Windows 下有以下取值:

    • SD_RECEIVE:關(guān)閉接收操作,也就是斷開輸入流。
    • SD_SEND:關(guān)閉發(fā)送操作,也就是斷開輸出流。
    • SD_BOTH:同時關(guān)閉接收和發(fā)送操作。


    至于什么時候需要調(diào)用 shutdown() 函數(shù),下節(jié)我們會以文件傳輸為例進(jìn)行講解。

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

    確切地說,close() / closesocket() 用來關(guān)閉套接字,將套接字描述符(或句柄)從內(nèi)存清除,之后再也不能使用該套接字,與C語言中的 fclose() 類似。應(yīng)用程序關(guān)閉套接字后,與該套接字相關(guān)的連接和緩存也失去了意義,TCP協(xié)議會自動觸發(fā)關(guān)閉連接的操作。

    shutdown() 用來關(guān)閉連接,而不是套接字,不管調(diào)用多少次 shutdown(),套接字依然存在,直到調(diào)用 close() / closesocket() 將套接字從內(nèi)存清除。

    調(diào)用 close()/closesocket() 關(guān)閉套接字時,或調(diào)用 shutdown() 關(guān)閉輸出流時,都會向?qū)Ψ桨l(fā)送 FIN 包。FIN 包表示數(shù)據(jù)傳輸完畢,計算機(jī)收到 FIN 包就知道不會再有數(shù)據(jù)傳送過來了。

    默認(rèn)情況下,close()/closesocket() 會立即向網(wǎng)絡(luò)中發(fā)送FIN包,不管輸出緩沖區(qū)中是否還有數(shù)據(jù),而shutdown() 會等輸出緩沖區(qū)中的數(shù)據(jù)傳輸完畢再發(fā)送FIN包。也就意味著,調(diào)用 close()/closesocket() 將丟失輸出緩沖區(qū)中的數(shù)據(jù),而調(diào)用 shutdown() 不會。

    總結(jié)

    以上是生活随笔為你收集整理的shutdown()函数:优雅地断开TCP连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。