【发布时间】:2019-11-19 00:00:32
【问题描述】:
我正在尝试将数据包/字节从 TcpStream 传输到另一个,反之亦然。我创建了一个结构 Connection:
pub struct Connection {
pub client_socket: TcpStream,
pub server_socket: TcpStream
}
我正在尝试打开两个线程,以便可以双向传输所有字节。可悲的是,我正在尝试使用移动值,因为我第二次调用了连接。我该如何解决?
thread::spawn(move || loop { connection.transfer_server_client_packet(); });
thread::spawn(move || loop { connection.transfer_client_server_packet(); });
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)
}
}
【问题讨论】:
-
您能添加
transfer_server_client_packet和transfer_client_server_packet签名吗?发生了什么已经很清楚了(简而言之,如果他们不需要,他们不应该接受self),但这应该为我们和未来的读者简化事情。 -
将您的连接包装成
Arc<>。这将解决moved value问题。然而,您的方法签名可能包含&mut self,这将导致一个新问题,因为单独的Arc不允许被可变借用。然后,您应该考虑一个具有内部可变性的解决方案。首先添加@Cerberus 提到的签名。
标签: rust