距離Rust一個std::net::UdpSocket
讀取數據時,我們使用一個緩衝:應使用什麼大小的緩衝區來讀取UDP套接字?
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
多大應該這個緩衝區呢?套接字是流還是數據報?
距離Rust一個std::net::UdpSocket
讀取數據時,我們使用一個緩衝:應使用什麼大小的緩衝區來讀取UDP套接字?
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
多大應該這個緩衝區呢?套接字是流還是數據報?
您可以嘗試使用接收/發送匹配的插座接收/發送選項緩衝區大小,見SO_SNDBUF and SO_RCVBUF on Linux sockets,getsockopt(3)
,SO_RCVBUF
和SO_SNDBUF
。
或者,您可以使用與您的協議結構匹配並良好對齊的緩衝區大小。
程序中的緩衝區大小越大,執行的IO調用就越少。在從多個不相交的內存位置組裝有效載荷的情況下,可以使用分散/聚集IO向量來最小化IO系統調用。
您應該使用比最大預期數據報更大的尺寸。這樣,如果您收到一個這樣的大小,您知道有一個協議錯誤,並且該數據可能已被截斷。
您將一次收到一個數據報。這不是一個流。
是的,很明顯緩衝區的大小應該與協議結構相關聯。但是,在我的函數(處理讀事件)被調用之前,多個傳入的消息可能會累積在系統UDP緩衝區中。所以不可能預測什麼尺寸足夠了。 –
如何在Rust中獲取SO_SNDBUF和SO_RCVBUF?在使用動態分配的緩衝區的情況下,有必要使用使性能變差的堆。 –
使用UDP,每個讀取操作只能接收一個數據報,因此除非您將消息拆分爲多個數據報,否則您應該能夠根據消息大小調整緩衝區大小。 –