shutdown函式 套接字選項

2021-08-13 00:47:18 字數 2759 閱讀 2767

有的時候客戶端批量傳送資料,傳送完資料後,如果直接呼叫close(假設引用計數為0)

則傳送端與接收端均被關閉。但可能管道中還有資料在傳輸,這時管道中對方的ack,以及fin的確認

就不能收到了,連線就不是正常關閉。

close函式把描述符的引用計數減一,僅僅在該計數變為0的時候,才真正的關閉套接字,而使用

shutdown函式可以不管引用計數就激發了tcp的正常連線終止序列;

close函式終止讀和寫兩個方向的資料傳輸。既然tcp連線是全雙工的,有時候我們需要告知對端我們已

經完成了資料傳送,我們僅僅需要關閉資料傳送的乙個通道,但是我們還是可以接收到對端傳送過來的

資料,這種控制只有利用shutdown函式才能實現。

1>.如果有多個程序共享乙個套接字,close每被呼叫一次,計數減1,直到計數為0時,也就是所用程序

都呼叫了close,套接字將被釋放。

2>. 在多程序中如果乙個程序中shutdown(sfd,shut_rdwr)後其它的程序將無法進行通訊. 如果乙個

程序close(sfd)將不會影響到其它程序.

so_debug:本選項僅由tcp支援,當給乙個tcp套接字開啟此選項時,核心將為tcp在該套接字傳送和

接受的所有分組保留詳細跟蹤資訊

so_error:當乙個套接字發生錯誤,源於bsd的核心中的協議模組將該套接字的名為so_error的變數設為標準的unix

e***值中的乙個,我們稱它為該套接字的待處理錯誤。核心能夠以以下兩種方式通知程序這個錯誤:

1> 如果程序阻塞在對套接字的select呼叫上,那麼無論檢查可讀條件還是可寫條件,select均返回並設定

其中一或2個條件。

2> 如果程序使用訊號驅動式i/o模型。那就給程序或程序組產生乙個sigio訊號。

so_keepalive:設定該選項後,如果兩小時內在該套接字的任一方向上都沒資料

交換,tcp就自動給對端傳送乙個保持存活探測分節。這是乙個對端必須響應的分節,

他會導致以下三種情況

1> 對端以期望的ack響應。應用程序得不到通知(因為一切正常)。再又經過仍無動靜的

2小時後,tcp將發出另乙個探測分節

2> 對端以rst響應,它告知本段tcp,對端已經崩潰並重啟。該套接字的待處理錯誤被置為

econnreset,套接字本身則被關閉

3> 對端保持存活探測分節沒有任何響應。源自bsd的tcp將另外傳送8個探測分節。最後還得不

到響應的話就放棄。

so_linger:

情形對端程序崩潰

對端主機崩潰

對端主機不可達

本端tcp正主動傳送資料

對端tcp傳送乙個fin分節,

這通過使用select判斷可讀條件

立即能檢測出來。如果本端tcp

傳送另外乙個分節。對端tcp就以

rst響應。如果在本端接受到rst

後禁用程序仍嘗試寫套接字。我們的

套接字實現就給程序傳送乙個sigpipe

訊號本端tcp將超時,且該套待

處理錯誤被置etimedout

本端tcp將超時,且該套接字的待

處理錯誤被置為ehostunreach

本端tcp正主動接收資料

對端tcp將傳送乙個fin,我們將把它

作為乙個(可能是過早的)eof讀入

我們將停止接受資料

我們將停止接受資料

連線空閒,保持存活選項

(so_keepalive)以設定

對端tcp傳送乙個fin分節,

這通過使用select判斷可讀條件

立即能檢測出來。

在毫無動靜2小時後,

傳送9個保持存活探測

分節。然後用套接字的

待處理錯誤被設定為

etimrdout

在毫無動靜2小時後,

傳送9個保持存活探測

分節。然後用套接字的

待處理錯誤被設定為

ehostunreach

連線空閒,保持存活選項

(so_keepalive)以設定

對端tcp傳送乙個fin分節,

這通過使用select判斷可讀條件

立即能檢測出來。無無

struct  linger;

函式說明

shutdown.shut_rd

在套接字上不能再接受請求。程序仍可向套接字中傳送資料。接受緩衝區資料被丟棄。再接收到的任何

資料都被丟棄。對套接字傳送緩衝區沒有影響

shutdown,shut_wr

在套接字上不能再傳送請求。程序仍可接收資料。傳送緩衝區中的剩餘資料將被傳送 ,後跟fin終止序列

close,l_onoff=0

(預設情況)

在套接字上不能再接受或傳送資料。套接字傳送緩衝區中的內容被傳送到對端。接受緩衝區的內容被丟棄。

如果描述符的引用計數=0,那麼傳送完資料後,跟以fin終止序列

close,l_onoff=1

l_linger=0

在套接字上不能再接受或傳送資料。如果描述符的引用計數=0,rst被傳送給對端。連線的狀態置為

closed(沒有time_wait狀態)。套接字傳送緩衝區和套接字接受緩衝區都被丟棄

close,l_linger=1

l_linget !=0

在套接字上不能再接受或傳送資料。傳送緩衝區中的剩餘資料將被傳送 ,如果描述符的引用計數=0,在傳送完傳送緩衝區的資料後,跟以fin終止序列。接受緩衝區的資料被丟棄。如果連線變為closed狀態前延滯

時間到,則返回e_wouldblock錯誤

套接字選項

有很多方法獲取和設定影響套接字的選項 getsockopt和setsockopt函式 fcntl函式 ioctl函式 getsockopt和setsockopt函式 int getsockopt int sockfd,int level,int optname,void optval,socklen...

套接字選項

之前讀過unix網路程式設計,現在在看nginx原始碼,很多套接字選項不記得了,因此每遇到乙個套接字選項就在此文章中進行補充。1.獲取和設定套接字選項的方法 getsockopt,setsockopt函式 fcntl函式 ioctl函式 2.4種函式簡介 i.getsockopt,setsockop...

通用套接字選項和TCP套接字選項

1.套接字選項函式原型 include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int level,int optname,const...