&str) -> Result<(), Box<dyn std::error::Error>> {
let mut file = File::open(file_path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
// Кодируем содержимое файла в base64
let encoded_file = encode(&buffer);
// Отправка размера закодированного файла
let file_size = encoded_file.len();
client_socket.write_all(file_size.to_string().as_bytes())?;
// Отправка закодированного файла
client_socket.write_all(encoded_file.as_bytes())?;
Ok(())
}
Вызывается она так:
if let Err(err) = send_file(&mut client_socket, command) {
println!("{}", err);
}}
Мне нужно добавить многопоточность, я изменил код запуска так:
thread::spawn(|| {
if let Err(err) = send_file(&mut client_socket, command) {
println!("{}", err);
}
Но возникает ошибка
cannot borrow `client_socket` as mutable more than once at a time
second mutable borrow occurs here
что делать?
у тебя несколько потоков в один сокет пишут?
покажи код функции внутри которой ты создаёшь поток
А зачем кодировать в base64?
Просто так
// Receive a command from the server let mut response = vec![0; BUFF_SIZE]; let bytes_received = client_socket.read(&mut response)?; if bytes_received == 0 { println!("Error while receiving request!"); break; } let command = String::from_utf8_lossy(&response[..bytes_received]); println!("{}", command); let parts: Vec<&str> = command.split(":::").collect(); let wanna = parts[0]; let command = parts[1]; println!("{}", command); if wanna == "file" { thread::spawn(|| { if let Err(err) = send_file(&mut client_socket, command) { println!("{}", err); } }); } } else { invalid_wanna(&mut client_socket); } // Clear the buffer client_socket.flush()?; response.clear(); }
и вообще коду плохо
почему бы не передавать client_socket в send_file?
сейчас ты передаешь &mut client_socket
Обсуждают сегодня