1) API for send here返回Result<usize>.为什么?在我的脑海中,UDP发送是全部还是全部.返回值似乎表明发送可以成功,但可能无法写入整个数据,这使我的代码如下:

let mut bytes_written = 0;
while bytes_written < data.len() {
    bytes_written += match udp_socket.send_to(&data[bytes_written..]) {
         Ok(bytes_tx) => bytes_tx,
         Err(_) => break,
    }
}

最近有人告诉我这完全没有必要.但我不明白.如果这是真的,为什么回报不是Result<()>,这也是我所期待的?

2)

推荐答案

这两个问题的答案都在相应BSD套接字函数sendto()recvfrom()的文档中.如果你使用一些*nix系统(例如OS X或Linux),你可以使用man sendtoman recvfrom来找到它.

1) sendto()手册页在这方面相当模糊;Windows API页面明确表示返回值可能小于len参数.另见第this条问题.这一特殊时刻似乎没有得到充分的记录.我认为,假设返回值总是等于len或错误代码可能是安全的.如果通过sendto()发送的数据长度超过操作系统内核内部的缓冲区大小,可能会出现问题,但在这种情况下,似乎至少Windows会返回错误.

2) recvfrom()人页明确指出,数据报中不适合缓冲区的部分将被丢弃:

recvfrom()函数将返回消息的长度

所以,是的,recv_from()将正好填充recv_from()个字节,其余的将被丢弃,对recv_from()的进一步调用将返回新的数据报.

Rust相关问答推荐

包含嵌套 struct 的CSV

borrow 和内部IntoIterator

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

铁 rust 干线无法使用PowerShell获取环境变量

捕获FnMut闭包的时间不够长

铁 rust 中双倍或更多换行符的更好练习?

通过RabbitMQ取消铁 rust 中长时间运行的人造丝任务的策略

程序在频道RX上挂起

用于实现获取 struct 体 id 的特征规范

找不到 .has_func 或 .get_func 的 def

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

将引用移动到线程中

有没有办法通过命令获取 Rust crate 的可安装版本列表?

&str 的编译时拆分是否可能?

第 7.4 章片段中如何定义 `thread_rng`

具有生命周期和以后引用的可变方法

隐式类型闭包的错误生命周期推断

相交着色器从 SSBO 中读取零

有没有办法隐藏类型定义?

令人困惑的错误消息? (解包运算符)