我正在尝试将数据包/字节从一个TcpStream传输到另一个,反之亦然。我已经创建了一个结构Connection
pub struct Connection {
pub client_socket: TcpStream,
pub server_socket: TcpStream
}我正在尝试打开两个线程,这样我就可以在两个方向上传输所有字节。遗憾的是,我正在尝试使用一个已移动的值,因为我第二次调用了connection。我怎么才能修复它呢?
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)
}
}发布于 2019-11-18 17:30:37
一旦移动了一个值--在本例中是Connection --您就不能再使用它了。如果您需要两个线程对同一连接进行可变访问,那么您可以克隆它或使用同步原语共享它,例如Arc。
例如:
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。共享变得必要的唯一原因是你已经将两个流存储在同一个结构中,这意味着你不能在不借用另一个的情况下借用其中一个。
https://stackoverflow.com/questions/58905915
复制相似问题