有的時候客戶端批量傳送資料,傳送完資料後,如果直接呼叫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...