首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决TcpStream的“移动值”问题?

如何解决TcpStream的“移动值”问题?
EN

Stack Overflow用户
提问于 2019-11-18 06:42:45
回答 1查看 87关注 0票数 0

我正在尝试将数据包/字节从一个TcpStream传输到另一个,反之亦然。我已经创建了一个结构Connection

代码语言:javascript
复制
pub struct Connection {
    pub client_socket: TcpStream,
    pub server_socket: TcpStream
}

我正在尝试打开两个线程,这样我就可以在两个方向上传输所有字节。遗憾的是,我正在尝试使用一个已移动的值,因为我第二次调用了connection。我怎么才能修复它呢?

代码语言:javascript
复制
thread::spawn(move || loop { connection.transfer_server_client_packet(); });
thread::spawn(move || loop { connection.transfer_client_server_packet(); });
代码语言:javascript
复制
impl Connection {
    fn get_packet(&mut self, from_client: bool) -> Result<Packet, io::Error> {
        unimplemented!()
    }
    pub fn get_client_packet(&mut self) -> Result<Packet, io::Error> {
        self.get_packet(true)
    }
    pub fn get_server_packet(&mut self) -> Result<Packet, io::Error> {
        self.get_packet(false)
    }
    fn send_packet(&mut self, from_client: bool, mut packet: Packet) -> Result<Packet, io::Error> {
        unimplemented!()
    }
    pub fn send_client_packet(&mut self, packet: Packet) -> Result<Packet, io::Error> {
        self.send_packet(true, packet)
    }
    pub fn send_server_packet(&mut self, packet: Packet) -> Result<Packet, io::Error> {
        self.send_packet(false, packet)
    }
    fn transfer_packet(&mut self, from_client: bool, to_client: bool) -> Result<usize, io::Error> {
        let packet = if from_client {
            self.get_client_packet()?
        } else {
            self.get_server_packet()?
        };
        if to_client {
            self.send_client_packet(packet)?
        } else {
            self.send_server_packet(packet)?
        };
        Ok(0)
    }
    pub fn transfer_client_server_packet(&mut self) -> Result<usize, io::Error> {
        self.transfer_packet(true, false)
    }
    pub fn transfer_server_client_packet(&mut self) -> Result<usize, io::Error> {
        self.transfer_packet(false, true)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-18 17:30:37

一旦移动了一个值--在本例中是Connection --您就不能再使用它了。如果您需要两个线程对同一连接进行可变访问,那么您可以克隆它或使用同步原语共享它,例如Arc

例如:

代码语言:javascript
复制
let connection = Arc::new(Mutex::new(Connection::new()));
let connection_server_client = Arc::clone(&connection);
let connection_client_server = Arc::clone(&connection);

thread::spawn(move || loop {
    let connection = connection_server_client.lock().unwrap();
    connection.transfer_server_client_packet();
});

thread::spawn(move || loop {
    let connection = connection_client_server.lock().unwrap();
    connection.transfer_client_server_packet();
});

此设置管理共享资源,以便一次只有一个线程可以改变它。它还将确保在两个线程都使用完该资源时删除该资源。

话虽如此,我会考虑重构你的代码:这两个线程实际上并不需要相同的TcpStream。共享变得必要的唯一原因是你已经将两个流存储在同一个结构中,这意味着你不能在不借用另一个的情况下借用其中一个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58905915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档