Метод 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(())