Please see code example below. You can see that after the client connection is dropped
./examples/file.rs
use std::io::Error;
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
const EOF: usize = 0;
fn read(stream: &mut TcpStream) -> Result<usize, Error> {
let mut buf = [1; 10];
let n = stream.read(&mut buf)?;
println!("recv: {:x?}", &buf[..n]);
Ok(n)
}
fn write(stream: &mut TcpStream) -> Result<usize, Error> {
let mut buf = [1; 10];
let n = stream.write(&mut buf)?;
println!("send: {:x?}", &buf[..n]);
Ok(n)
}
fn main() -> Result<(), Error> {
let addr = "0.0.0.0:8080";
let acp = TcpListener::bind(addr)?;
let mut clt = TcpStream::connect(addr)?;
let (mut svc, _addr) = acp.accept()?;
println!("clt: {:?}, svc: {:?}", clt, svc);
assert_ne!(write(&mut clt)?, EOF);
assert_ne!(read(&mut svc)?, EOF);
drop(clt);
// Why does read immediatelly recognizes that client reset connection
assert_eq!(read(&mut svc)?, EOF); // pass - as expected - client disconnected
assert_eq!(write(&mut svc)?, EOF); // fail - NOT as expected - does not realize client disconnected
Ok(())
}
Error i get for a reference.
thread 'main' panicked at experimentation/examples/close_stream.rs:35:5:
assertion `left == right` failed
left: 10
right: 0
stack backtrace:
0: rust_begin_unwind
at /rustc/2f5df8a94bb3c5fae4e3fcbfc8ef20f1f976cb19/library/std/src/panicking.rs:619:5
1: core::panicking::panic_fmt
at /rustc/2f5df8a94bb3c5fae4e3fcbfc8ef20f1f976cb19/library/core/src/panicking.rs:72:14
2: core::panicking::assert_failed_inner
3: core::panicking::assert_failed
at /rustc/2f5df8a94bb3c5fae4e3fcbfc8ef20f1f976cb19/library/core/src/panicking.rs:269:5
4: close_stream::main
at ./experimentation/examples/close_stream.rs:35:5
5: core::ops::function::FnOnce::call_once
at /rustc/2f5df8a94bb3c5fae4e3fcbfc8ef20f1f976cb19/library/core/src/ops/func