socket的ReceiveBufferSize屬性和呼叫Receive用的byte 大小要對應嗎

時間 2021-07-07 13:03:14

1樓:我是阿柒啊

不需要,ReceiveBufferSize是緩衝區,socket對端傳送的資料存放在緩衝區。

應用程式呼叫read()或receve()時,從socket的ReceiveBufferSize中把資料copy到應用程式的byte中,

如果byte > ReceiveBufferSize,一次性就可以把緩衝區資料讀進來。

如果byte < ReceiveBufferSize,就不能一次性將緩衝區中的所有資料讀出,會多次讀入,直到讀完

2樓:乾貨滿滿張雜湊

這個建議去了解一下網路通訊Naggle演算法:

首先,TCP 通訊會有粘包/拆包,主要是因為不論是傳送方,還是接收方,都會有緩衝:

傳送方原因:TCP 缺省會使用Nagle演算法,該演算法認為網路是擁堵的,應該減少傳送的次數,所以傾向於等待一段時間將多個包粘在一起發出。對於不同需求,需要考慮是否應該禁用Nagle演算法,假設我們應用的協議是一請求一應答的模式,不會在請求後應答前還有請求發出,則應該禁用。

通過設定TCP_NODELAY禁用Nagle演算法。

接收方原因:接收方有緩衝,每次從緩衝區讀取所有內容,但是這個緩衝區可能有幾個包,也可能連乙個包都沒盛下,所以就會有粘包/拆包

上層的語言都會封裝,考慮有沒有零拷貝以及網絡卡和DMA(Direct Memory Access)交換以及作業系統等因素,你的這個 byte可能是系統直接記憶體或者是上層語言從系統記憶體複製過來的。假設是從系統記憶體複製過來的,其實就是你的程式每次要拿多少資料處理,網路傳輸是不確定的,你並不知道你會在什麼時間接收到多少資料以及資料的完整性,因為拆包粘包。

Receive 用的 byte是可能經過複製的(取決於是否零拷貝),你的 ReceiveBufferSize 指定的是建立連線用來接收資料的系統記憶體buffer。抽象出來 byte 其實就是相當於與建立連線用來接收資料的系統記憶體buffer隔離開,讓你不用關係系統記憶體buffer的讀取過期重新整理等處理,只用關心 byte 裡面的資料。比如,ReceiveBufferSize 設定大一點,可以多快取處理資料,然後抽象出比較小的 byte交給程式多執行緒處理,也是一種場景下的應用。

所以你基本上只用考慮你的程式每次處理多少資料比較合適去設定 byte 大小就行了。

網路程式設計必須使用socket嗎

son joh 閒來無事 檢視OSI RM,每一層都有介面供上層協議呼叫的,所以只要找到每一層協議的實際實現設計者實際實現了或者實際提供了什麼介面 API,那麼上層協議使用者都可以使用這些介面 API了,程式猿一般在應用層到資料鏈路層中的任意或多個層。windows協議設計實現者,網絡卡設計,物理層...

Windows 建立許多socket並連線,達到一定數目(不足2000)時,發生超時錯誤,是怎麼解決?

Win7下我用單個程序跑壓力測試,開過9000個埠連伺服器.還處理一些遊戲邏輯,並沒有什麼問題.服務端也測過,WinServer2008.乙個閘道器接受3000個埠.開了3個閘道器,沒有什麼問題.Linux服務端也測過.CentOS7.同上.乙個閘道器接受3000個埠.開了3個閘道器.也沒什麼問題 ...

Http 與socket混合應用開發?

飄逸的h 你的問題看明白了,不過http是協議,socket是指的通訊,http通訊實際上也是socket通訊,只是通訊協議用的是http協議罷了 而socket通訊可以是長連線也可以是短連線,http一般是使用短連線,這兩者的關係別搞混了。你說的問題實際上就是你的web的某個操作怎麼傳送給你的硬體...