РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1125 of 1245 menu

Метод 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,
    который переключает поток в неблокирующий режим
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить