networking - rust 迹所有权问题

标签 networking rust ownership mio

我对Rust还是很陌生,主要是C#,javascript和python开发人员,因此我喜欢以OOP方式进行处理,但是我仍然无法将所有权归于rust。特别是在面向对象方面。
我正在写一个TCP服务器。我有一个包含连接(流)的结构,我使用mio条板箱异步读取了套接字。我知道错误告诉我什么,但我不知道如何解决。我尝试将read_message方法更改为一个函数(不引用self),该函数可以正常工作,但是问题是我需要访问结构的连接(例如在套接字之间中继消息),因此此解决方法在以后的版本中将不可行。是否有一个简单的解决方法,还是设计固有的缺陷?
这是显示我的问题所在的代码段:

let sock = self.connections.get_mut(&token).unwrap();
loop {
    match sock.read(&mut msg_type) {
        Ok(_) => {
            self.read_message(msg_type[0], token);
        }
    }
}

fn read_message(&mut self, msg_type: u8, token: Token) {
    let sock = self.connections.get_mut(&token).unwrap();
    let msg_type = num::FromPrimitive::from_u8(msg_type);
    match msg_type {
        Some(MsgType::RequestIps) => {
            let decoded: MsgTypes::Announce = bincode::deserialize_from(sock).unwrap();
            println!("Public Key: {}", decoded.public_key);
        }
        _ => unreachable!()
    } 
}
我得到的错误如下:
enter image description here

最佳答案

当您尝试调用sock时,您正在对self的一部分self.read_message进行可变借入。由于您指示read_message需要对所有self进行可变访问,因此您需要确保此时不再对sock进行可变借用。
幸运的是,由于Rust 2018中的非词汇生命周期,这并不难做到;只需在循环内获取sock即可:

loop {
    let sock = self.connections.get_mut(&token).unwrap();
    match sock.read(&mut msg_type) {
        Ok(_) => {
            self.read_message(msg_type[0], token);
        }
    }
}
假设sock.read不返回任何持有sock借项的内容,则应该在调用sock之前释放对self.read_message的可变借项。需要在下一次迭代中重新获取它,但是看到您正在执行网络I/O时,单个HashMap(?)访问的相对性能损失应该可以忽略不计。
(由于缺少最小的,可编译的示例,因此我无法对此进行测试。)

关于networking - rust 迹所有权问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957980/

相关文章:

c# - 网络 - 通过端口发送的字节数

rust - 如何在用户不按 Enter 键的情况下获取键盘输入?

rust - 返回位置的值是否总是在父堆栈框架或接收框中分配?

http - Wireshark 的简单 Http 替代方案

android - okHttp :why my application is crashing didnt get response

Laravel homestead 多个站点选择哪个本地可访问

multithreading - 在使用 MPSC channel 时,Rust 提供了哪些工具来避免复制?

C++ 析构函数和所有权

rust - Rust:如何将Entry API与拥有的数据结合起来?

rust - 由于 Rust 中只能有一个所有者,这是否意味着浅拷贝是不可能的?