Вариант Write класса Shutdown
Вариант Write перечисления Shutdown
указывает, что при вызове метода shutdown
у сетевого потока будет закрыта только
возможность записи данных. Чтение из соединения
при этом остаётся доступным. Этот вариант
полезен, когда нужно сообщить удалённой стороне
о завершении отправки данных, но при этом
продолжить получать ответ.
Синтаксис
Shutdown::Write
Пример
Давайте создадим TCP-соединение и закроем только запись, оставив чтение открытым:
use std::net::{TcpListener, TcpStream, Shutdown};
use std::thread;
fn main()
{
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
let handle = thread::spawn(move || {
let (mut stream, _) = listener.accept().unwrap();
stream.shutdown(Shutdown::Write).unwrap();
println!("Write side closed");
});
let mut stream = TcpStream::connect("127.0.0.1:8080").unwrap();
stream.shutdown(Shutdown::Write).unwrap();
println!("Client write side closed");
handle.join().unwrap();
}
Результат выполнения кода:
Client write side closed
Write side closed
Пример
Давайте проверим, что после вызова
Shutdown::Write чтение всё ещё доступно:
use std::net::{TcpListener, TcpStream, Shutdown};
use std::io::{Read, Write};
use std::thread;
fn main()
{
let listener = TcpListener::bind("127.0.0.1:8081").unwrap();
let handle = thread::spawn(move || {
let (mut stream, _) = listener.accept().unwrap();
stream.write_all(b"abcde").unwrap();
stream.shutdown(Shutdown::Write).unwrap();
});
let mut stream = TcpStream::connect("127.0.0.1:8081").unwrap();
stream.shutdown(Shutdown::Write).unwrap();
let mut buf = String::new();
stream.read_to_string(&mut buf).unwrap();
println!("{}", buf);
handle.join().unwrap();
}
Результат выполнения кода:
"abcde"
Смотрите также
-
перечисление
Shutdown,
которое определяет способы закрытия сетевого соединения -
вариант
Read,
который закрывает только чтение из соединения -
вариант
Both,
который закрывает и чтение, и запись -
тип
ToSocketAddrs,
который используется для преобразования адресов в сокеты