Linux C中的Socket,shutdown函式和close函式有什麼不同?

時間 2021-06-09 13:21:59

1樓:codinghuang

有時候,使用shutdown可以避免應用層錯誤處理tcp連線導致tcp包收不完整。

有這樣乙個例子,假設服務端需要傳送1M的資料給客戶端,那麼,你可能就是寫乙個迴圈,每次往客戶端傳送1kb的資料。但是這個時候,不是你服務端應用層寫多少,核心就立馬發多少,因為它有乙個核心緩衝區。所以,當你伺服器的迴圈跳出來之後,實際上,核心可能還沒有完全把資料都發給客戶端,這個時候,如果客戶端有資料發過來到了服務端讀的核心緩衝區,但是你寫的服務端沒有去讀出來,而是直接呼叫close關閉連線,那麼核心會傳送rst 分節給客戶端。

這個時候,客戶端那邊就無法讀取服務端發給客戶端剩餘的那些資料了。然後就有人覺得tcp是不可靠的協議了,丟包了。其實不是的,是應用層錯誤的關閉了連線。

所以,有一種做法是,當你服務端應用層迴圈的傳送所有的資料到核心緩衝區之後,先呼叫shutdown關閉寫的那一端,實際上就是傳送fin分節,然後客戶端讀完所有資料後,就會收到這個fin分節,這個時候,客戶端會close掉連線,然後服務端收到客戶端的fin分節之後,再呼叫close關閉連線。

這樣可以一定程度的減少應用層丟包。

linux C怎麼獲取程序生存的乙個特徵

果凍蝦仁 date s r proc pid cmdline 變數pid儲存你監控程序的pid。上述命令獲取到的是你程序建立的時間戳 單位 秒 當然你也可以監控proc目錄下的其他檔案,但是要注意有些檔案的時間戳有可能在執行期間發生變化的。另外如果你覺得秒的粒度太粗。你可以自行修改date命令的fo...

Angular中import from 中的 的作用是什麼?

1.因為NPM上的公共包需要命名,而命名存在重名情況,對應特定專案下使用的包或者防止重名,可以用下scope package。有點類似於JS防止全域性變數汙染的,比如a是個全域性變數,但是怕被其他程式設計師寫的汙染,就會弄個dog.a或者pig.a 2.npm上管理的還有種情況也是scope pac...

計算化學中的metadynamics中的collective varible如何選取?

找這東西已經過時了 危言聳聽一下子,被嚇跑我不負責 現在用弦方法 string method 暴力算即可。弦方法是中中國人的驕傲,應用數學家鄂維南 於2000年左右開發的非常抽象的方法,在近年來漸漸被一些基礎好的人應用到生物模擬中,著名人物有Benoit Roux Eric Vanden Eijnd...