对于TcpStreams的Read trait如何起作用的误解

问题描述 投票:-1回答:1

我的目标是从TcpStream读取一些字节,以便解析每条消息中的数据并从中构建结构。

loop {
    let mut buf: Vec<u8> = Vec::new();
    let len = stream.read(&mut buf)?;
    if 0 == len {
        //Disconnected
    }
    println!("read() -> {}", len);
}

[就像Python中一样,我以为stream.read()会阻塞直到它接收到一些数据。因此,我设置了一个服务器,该服务器为每个传入的连接调用上面看到的循环。然后,我尝试使用netcat连接到服务器。 netcat成功连接到服务器并阻塞了stream.read(),这正是我想要的;但是一旦我发送一些数据,read()就返回0。我也尝试过使用stream.read_to_end()做类似的事情,但它似乎只在连接关闭时才返回。

我如何从TcpStream读取每个消息的消息,知道每个消息可以具有不同的未知大小?

tcp rust
1个回答
1
投票

[尽管在特定情况下它们都相互作用,但与Vec相比,std::io::Read的潜在技术性让您更加着迷。

Read状态的定义和文档:

如果此方法的返回值为Ok(n),则必须保证0 <= n <= buf.len()。 n值非零表示缓冲区buf已被来自该源的n个字节的数据填充。如果n为0,则可以指示以下两种情况之一:

重要部分以粗体显示。

按照您的方式定义新的Vec时,其容量为zero。这意味着基础切片(将用作缓冲区)的长度为零。结果,由于必须确保0 <= n <= buf.len()并且buf.len()为零,因此read()调用将立即返回读取的0字节。]

要“修复”此问题,您可以为VecVec::new().resize(1024, 0))分配一组默认元素,也可以只使用一开始就使用的数组(let mut buffer:[u8; 1024] = [0; 1024]

© www.soinside.com 2019 - 2024. All rights reserved.