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

Метод shutdown

Метод shutdown класса TcpStream завершает одну или обе половины TCP-соединения: отправку данных, приём данных или и то, и другое. Параметром метод принимает значение перечисления Shutdown, которое указывает, какую именно часть соединения нужно закрыть. Метод возвращает Result с типом в случае успеха или ошибку std::io::Error при неудаче.

Перечисление Shutdown содержит три варианта: Shutdown::Read закрывает поток чтения, Shutdown::Write закрывает поток записи, Shutdown::Both закрывает обе половины соединения.

Синтаксис

use std::net::Shutdown; TcpStream::shutdown(self, how: Shutdown) -> Result<()>

Пример

Давайте создадим TCP-соединение, отправим данные и закроем поток записи с помощью Shutdown::Write:

use std::io::prelude::*; use std::net::{TcpListener, TcpStream, Shutdown}; use std::thread; fn main() { let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); thread::spawn(move || { let mut stream = TcpStream::connect("127.0.0.1:8080").unwrap(); stream.write(b"abcde").unwrap(); stream.shutdown(Shutdown::Write).unwrap(); }); for stream in listener.incoming() { let mut stream = stream.unwrap(); let mut buf = String::new(); stream.read_to_string(&mut buf).unwrap(); println!("{}", buf); } }

Результат выполнения кода:

"abcde"

Пример

Давайте закроем обе половины соединения с помощью Shutdown::Both:

use std::net::{TcpListener, TcpStream, Shutdown}; use std::thread; fn main() { let listener = TcpListener::bind("127.0.0.1:8081").unwrap(); thread::spawn(move || { let stream = TcpStream::connect("127.0.0.1:8081").unwrap(); stream.shutdown(Shutdown::Both).unwrap(); println!("shutdown complete"); }); for stream in listener.incoming() { let stream = stream.unwrap(); let _ = stream.shutdown(Shutdown::Both); } }

Результат выполнения кода:

"shutdown complete"

Пример

Давайте закроем только поток чтения с помощью Shutdown::Read и проверим результат выполнения метода:

use std::net::{TcpListener, TcpStream, Shutdown}; use std::thread; fn main() { let listener = TcpListener::bind("127.0.0.1:8082").unwrap(); thread::spawn(move || { let stream = TcpStream::connect("127.0.0.1:8082").unwrap(); let res = stream.shutdown(Shutdown::Read); println!("{:?}", res); }); for stream in listener.incoming() { let _ = stream.unwrap(); } }

Результат выполнения кода:

Ok(())

Смотрите также

  • класс TcpStream,
    который представляет TCP-соединение между двумя узлами
  • метод connect,
    который устанавливает TCP-соединение с удалённым узлом
  • метод peer_addr,
    который возвращает адрес удалённого узла
  • метод try_clone,
    который создаёт независимый дескриптор того же соединения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить