【问题标题】:What size buffer should be used for reading from a UDP socket?应该使用什么大小的缓冲区来从 UDP 套接字读取?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以尝试使用与套接字接收/传输选项匹配的接收/传输缓冲区大小,请参阅SO_SNDBUF and SO_RCVBUF on Linux sockets、getsockopt(3)、SO_RCVBUF 和 SO_SNDBUF。

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

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

      【讨论】:

      • 是的,很明显缓冲区的大小应该与协议结构相关。但是,在调用我的函数(处理读取事件)之前,系统 UDP 缓冲区中可能会累积多个传入消息。所以无法预测什么尺寸是足够的。
      • 如何在 Rust 中获取 SO_SNDBUF 和 SO_RCVBUF?如果使用动态分配的缓冲区,则必须使用堆,这会使性能变差。
      • 使用 UDP,每次读取操作您只会收到一个数据报,因此除非您将消息拆分为多个数据报,否则您应该能够根据消息大小调整缓冲区大小。
      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多