【发布时间】:2016-03-31 12:48:20
【问题描述】:
在 Rust 中从 std::net::UdpSocket 读取数据时,我们使用缓冲区:
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
这个缓冲区应该有多大?套接字是流还是数据报?
【问题讨论】:
标签: sockets udp size rust buffer
在 Rust 中从 std::net::UdpSocket 读取数据时,我们使用缓冲区:
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
这个缓冲区应该有多大?套接字是流还是数据报?
【问题讨论】:
标签: sockets udp size rust buffer
您应该使用比最大预期数据报大一号的大小。这样一来,如果您收到这样大小的数据,您就知道存在协议错误并且数据可能已被截断。
您一次将收到一个数据报。这不是流。
【讨论】:
您可以尝试使用与套接字接收/传输选项匹配的接收/传输缓冲区大小,请参阅SO_SNDBUF and SO_RCVBUF on Linux sockets、getsockopt(3)、SO_RCVBUF 和 SO_SNDBUF。
或者,您可以使用与您的协议结构匹配并良好对齐的缓冲区大小。
程序中的缓冲区大小越大,执行的 IO 调用就越少。如果您从多个不相交的内存位置组装有效负载,您可以使用分散/收集 IO 向量来最小化 IO 系统调用。
【讨论】: