Метод try_clone
Метод try_clone класса TcpStream создаёт
новый экземпляр TcpStream, который ссылается
на то же самое TCP-соединение, что и исходный поток.
Оба дескриптора можно использовать независимо друг от
друга, например, для одновременного чтения и записи в
разных потоках выполнения. Метод не принимает параметров
и возвращает значение типа io::Result<TcpStream>.
В случае успеха возвращается новый поток, а при ошибке -
значение Err с описанием причины сбоя.
Синтаксис
let res = stream.try_clone();
Пример
Давайте создадим TCP-соединение с сервером и получим
его клон с помощью метода try_clone:
use std::net::TcpStream;
fn main()
{
let stream = TcpStream::connect("127.0.0.1:8080").unwrap();
let clone = stream.try_clone();
match clone
{
Ok(_) => println!("clone created"),
Err(e) => println!("error: {}", e),
}
}
Результат выполнения кода:
"clone created"
Пример
Давайте используем оригинальный поток и его клон для записи данных в одном потоке выполнения и чтения в другом:
use std::net::TcpStream;
use std::io::Write;
use std::thread;
fn main()
{
let mut stream = TcpStream::connect("127.0.0.1:8080").unwrap();
let mut clone = stream.try_clone().unwrap();
let handle = thread::spawn(move || {
clone.write_all(b"abcde").unwrap();
println!("data written");
});
handle.join().unwrap();
println!("done");
}
Результат выполнения кода:
"data written"
"done"
Пример
Давайте проверим, что метод возвращает ошибку, если соединение уже закрыто:
use std::net::TcpStream;
fn main()
{
let stream = TcpStream::connect("127.0.0.1:8080").unwrap();
drop(stream);
let res = stream.try_clone();
match res
{
Ok(_) => println!("clone created"),
Err(e) => println!("error: {}", e),
}
}
Результат выполнения кода:
"error: Bad file descriptor (os error 9)"
Смотрите также
-
класс
TcpStream,
который представляет TCP-соединение -
метод
connect,
который устанавливает соединение с удалённым узлом -
метод
shutdown,
который закрывает одну или обе половины соединения -
метод
set_nonblocking,
который переключает поток в неблокирующий режим