距离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,每个读取操作只能接收一个数据报,因此除非您将消息拆分为多个数据报,否则您应该能够根据消息大小调整缓冲区大小。 –