2 unstable releases
0.2.0 | Oct 20, 2023 |
---|---|
0.1.0 | Oct 19, 2023 |
#965 in Unix APIs
22KB
412 lines
tokio-unix-tcp
This crate wraps the tokio
types for Unix and TCP Listeners, Socket Addresses and Streams in a generic
enum each, with helper functions existing on both variants passed through.
On non Unix systems, all Unix specific behavior is compiled to no ops.
Types
Listener
Either a tokio::net::TcpListener
or tokio::net::UnixListener
. This wrapper allows binding to either
a path or IP address and port.
Binding returns a Listener
instance that can be used to await new incoming connections and accept them.
Accepting a connection returns a Socket
instance with both a local_addr
and peer_addr
.
The local_peer
will be the SocketAddr
the Listener
is bound to and peer_addr
will be the
remote IP address and port for a TCP socket and an unnamed unix socket address
(UnixSocketAddr::AbstractOrUnnamed
) for a Unix socket.
Use the Listener::bind_and_prepare_unix
function to remove an existing file at the bind path when using
Unix sockets. This function also allows adjusting the mode of the socket (defaults to 0o222
).
UnixSocketAddr
A more developer friendly version of tokio::net::unix::SocketAddr
for the purposes of this crate. Tokio
current does not support abstract Unix sockets, the underlying mio::net::SocketAddr
does however.
This leaves tokio::net::unix::SocketAddr
in an awkward state where calling is_unnamed
could return false
while as_pathname
also returns None
. The UnixSocketAddr
solves this by having a unified variant for
unnamed or abstract sockets.
SocketAddr
Either a std::net::SocketAddr
or UnixSocketAddr
. This type is used as the local or peer address of an
established stream.
Converting to a NamedSocketAddr
using to_named_socket_addr
may throw in case the unix socket is
UnixSocketAddr::AbstractOrUnnamed
, which is not representable as NamedSocketAddr
. See the documentation
below.
NamedSocketAddr
Either a std::net::SocketAddr
or std::path::PathBuf
. This type is used for creating a socket (connecting) or
creating a listener (binding).
This type differs from SocketAddr
in that it does not have an unnamed variant for the Unix socket. In case Tokio
starts to support abstract unix socket, the NamedSocketAddr::Unix
variant will also have to support this instead
of just a std::path::PathBuf
.
Converting to a SocketAddr
using to_socket_addr
always succeeds.
Stream
Either a tokio::net::TcpStream
or tokio::net::UnixStream
. This wrapper allows opening a new connection to either
a path or IP address and port.
When connecting succeeds it returns a Socket
instance with both a local_addr
and peer_addr
.
The local_peer
will be the local IP address and port for a TCP socket and an unnamed unix socket
address (UnixSocketAddr::AbstractOrUnnamed
) for a Unix socket and peer_addr
will be the remote
SocketAddr
(so IP address and port or path) of the server.
Flags and Compile Targets
Enabling the serde
flag adds serializer and deserializer helpers for SocketAddr
and NamedSocketAddr
.
Compiling on non unix
systems will exclude all unix specific functionality and imports. TCP will still work
perfectly fine.
Related work
multisock
for unifyingstd::net
andstd::os::unix::net
typesasync-uninet
for unifying async types fromasync_std
and types fromstd
As far as I can tell both of these don't handle the nuances of abstract and unnamed unix sockets very well, which this create also aims to fix.
License
This crate is permissively licensed under either the BSD 2-Clause "Simplified" License or MIT License.
Dependencies
~4–12MB
~131K SLoC