shutdown呼叫
int shutdown( int s, int how );
how = 0 : 關閉連線的接收端(也適用於udp)
how = 1 : 關閉連線的傳送端(後繼所有試圖對套接字進行寫操作都會除錯.將傳送緩衝區中所有的資料都傳送出去之後,tcp會向其對等實體傳送乙個fin,通知它沒資料了)
how = 2 : 兩端都關閉(通常不設定此引數,但是某些winsock實現中,如果不先設定2呼叫shutdown,closesocket無法正常工作.
how = 0, linux會重新整理輸入佇列,以丟棄應用程式還未讀取的所以資料,如果有新資料到達,tcp會進行ack,然後悄悄將其丟棄,因為應用程式再也無法接收資料了,windows中,如果資料在佇列中,或者有新資料到達,winsock都會重置連線,因此winsock下使用shutdown(s, 0 );是不安全的.
在winsock中,將how設定為2呼叫shutdown遇到的問題與設定為0遇到額問題相同----連線可能會重置
呼叫shutdown並沒有釋放套接字及其資源(how被設定為0或2時可能緩衝區釋放掉),同時會使的套接字的所有持有者都生效.而呼叫close或closesocket,不影響套接字的其他持有者
how = 1呼叫shutdown,不管其他程序是否開啟了這個套接字,都可以保證對等實體會收到乙個eof.而呼叫close或closesocket無法保證這一點,因為在套接字的引用計數減少到0之前,它都不會將fin傳送給對等實體
當應用程式的對等實體通過close,shutdown或terminate關閉了連線的寫入側時,select會返回乙個對套接字的讀事件,如果應用程式沒有檢查eof狀態,它可能要處理乙個長度為0的段.這是因為對等實體已經關閉了連線的寫入側,而讀事件實際是tcp向應用程式傳送了乙個來自對等實體的eof.
注意點:
深入淺出TCP與IP協議筆記
tcp ip 4層結構 應用層 傳輸層 網路層 鏈路層 探索過程問題 乙個主機的資料要經過哪些過程才到達對方的主機上 一組電訊號就是乙個資料報,乙個資料報稱為一幀,制定這個規則的就是乙太網協議 0 物理介質 http傳送乙個請求時,應用層,傳輸層,網路層和鏈路層的相關協議依次對 該請求 進行 包裝 ...
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...