Sockets 从UDP套接字读取时应使用多大的缓冲区?

Sockets 从UDP套接字读取时应使用多大的缓冲区?,sockets,udp,size,rust,buffer,Sockets,Udp,Size,Rust,Buffer,从内部数据库读取数据时,我们使用缓冲区: fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)> fn recv_from(&self,buf:&mut[u8])->结果 这个缓冲区应该有多大?套接字是流还是数据报?您可以尝试使用与套接字接收/发送选项匹配的接收/发送缓冲区大小,请参阅,getsockopt(3),SO_RCVBUF和SO_SNDBUF 或者,您可以使用与您的协议结

从内部数据库读取数据时,我们使用缓冲区:

fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
fn recv_from(&self,buf:&mut[u8])->结果

这个缓冲区应该有多大?套接字是流还是数据报?

您可以尝试使用与套接字接收/发送选项匹配的接收/发送缓冲区大小,请参阅,
getsockopt(3)
SO_RCVBUF
SO_SNDBUF

或者,您可以使用与您的协议结构匹配并对齐的缓冲区大小


程序中的缓冲区越大,执行的IO调用就越少。在从多个不相交的内存位置组装有效负载的情况下,您可以使用分散/聚集IO向量来最小化IO系统调用。

您应该使用大于最大预期数据报的大小。这样,如果您收到一个这样大小的数据,您就知道存在协议错误,并且该数据可能已被截断


您将一次收到一个数据报。它不是一个流。

是的,很明显,缓冲区的大小应该与协议结构相关。但是,在调用my函数(处理读取事件)之前,系统UDP缓冲区中可能会累积多条传入消息。所以不可能预测什么尺寸足够。我怎样才能得到锈状的sou SNDBUF和sou RCVBUF?在使用动态分配的缓冲区的情况下,有必要使用堆,这会降低性能。使用UDP,每次读取操作只会收到一个数据报,因此,除非您将消息拆分为多个数据报,否则您应该能够根据消息大小调整缓冲区的大小。