SO SNDBUF設定為0會發生什麼事情

2021-06-18 09:50:01 字數 749 閱讀 8327

乙個應用程式通過設定so_sndbuf為0把緩衝區關閉,然後發出乙個阻塞send()呼叫。在這樣的情況下,系統核心會把應用程式的緩衝區鎖定,直到接收方確認收到了整個緩衝區後send()呼叫才返回。似乎這是一種判定你的資料是否已經為對方全部收到的簡潔的方法,實際上卻並非如此。想想看,即使遠端tcp通知資料已經收到,其實也根本不代表資料已經成功送給客戶端應用程式,比如對方可能發生資源不足的情況,導致afd.sys不能把資料拷貝給應用程式。另乙個更要緊的問題是,在每個執行緒中每次只能進行一次傳送呼叫,效率極其低下。

把so_rcvbuf設為0,關閉afd.sys的接收緩衝區也不能讓效能得到提公升,這只會迫使接收到的資料在比winsock更低的層次進行緩衝,當你發出receive呼叫時,同樣要進行緩衝區拷貝,因此你本來想避免緩衝區拷貝的陰謀不會得逞。

現在我們應該清楚了,關閉緩衝區對於多數應用程式而言並不是什麼好主意。只要要應用程式注意隨時在某個連線上保持幾個wsarecvs重疊呼叫,那麼通常沒有必要關閉接收緩衝區。如果afd.sys總是有由應用程式提供的緩衝區可用,那麼它將沒有必要使用內部緩衝區。

高效能的伺服器應用程式可以關閉傳送緩衝區,同時不會損失效能。不過,這樣的應用程式必須十分小心,保證它總是發出多個重疊傳送呼叫,而不是等待某個重疊傳送結束了才發出下乙個。如果應用程式是按乙個發完再發下乙個的順序來操作,那浪費掉兩次傳送中間的空檔時間,總之是要保證傳輸驅動程式在傳送完乙個緩衝區後,立刻可以轉向另乙個緩衝區。

看來設定為0是沒有什麼好處的 

----------------------------

SO SNDBUF設定為0會發生什麼事情

chiway翻譯的裡面的一段 乙個應用程式通過設定so sndbuf為0把緩衝區關閉,然後發出乙個阻塞send 呼叫。在這樣的情況下,系統核心會把應用程式的緩衝區鎖定,直到接收方確認收到了整個緩衝區後send 呼叫才返回。似乎這是一種判定你的資料是否已經為對方全部收到的簡潔的方法,實際上卻並非如此。...

C 方法返回值為引用時會發生什麼

在學習qt的過程中,看到有些內建的qt庫中存在一些返回引用的方法,例如 等等,所以有點好奇,返回值與返回引用之間有什麼區別呢?遂有了這篇文章。在寫驗證程式的時候又對c 的建構函式 拷貝建構函式 賦值建構函式有了新的理解,文章末會放出完整的測試 第一步,我們需要乙個類,給他起個名字,就叫a吧。clas...

uni設定scroll top為0無效

具體原因還在找,但是找到了解決方法。首先要定義乙個變數記錄滾動條的位置 用 scroll scrollchange 監聽 滾動條變化 scrollchange e 定義乙個變數 存滾動的位置 當需要滾動到 初始值的時候 that.scrollanimation false 是否有過度效果 that....