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_split
for that, but I don't see anything like that in the standard library forTcpStream
orUnixStream
) 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
TcpStream
andUnixStream
(or any other streams) in the future. ThusTcpStream
andUnixStream
each have their ownset_read_timeout
methods. 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?