After working some more with TcpStream (and UnixStream), I came across more problems in real-life usage of these interfaces:
- Using threads and
std::io, it is not easily possible to make threads abort after a certain timeout (which is required for network applications). In order to do this, I had to implement my own wrapper, which calculates a timeout for each read or write operation. - It is not easily possible to split up the stream into a reading and a writing half that can be owned (Tokio provides a method called
into_splitfor that, but I don't see anything like that in the standard library forTcpStreamorUnixStream) other than cloning the socket usingtry_clone, which imposes overhead and may fail. - The standard library doesn't provide any abstraction layer for what's common in
TcpStreamandUnixStream(or any other streams) in the future. ThusTcpStreamandUnixStreameach have their ownset_read_timeoutmethods. I cannot even write a function that accepts some sort of "stream" where I can work with timeouts for single reading and writing operations as there is no respective trait (like "ReadWithTimeout" or "ReadWithDeadline" or similar) which would allow me to write a generic function.
Concluding, I have to say that I can work with Rust's standard library to write a network application – but it is a hassle.
I know these issues reach beyond the original topic of this post, but if we consider to improve TcpStream, then these other issues should be kept in mind as well. Maybe std::io needs to be overhauled in general?