Trait wasmtime_wasi::preview2::bindings::wasi::sockets::tcp::HostTcpSocket
source · pub trait HostTcpSocket {
Show 26 methods
// Required methods
fn start_bind(
&mut self,
self_: Resource<TcpSocket>,
network: Resource<Network>,
local_address: IpSocketAddress
) -> Result<(), SocketError>;
fn finish_bind(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(), SocketError>;
fn start_connect(
&mut self,
self_: Resource<TcpSocket>,
network: Resource<Network>,
remote_address: IpSocketAddress
) -> Result<(), SocketError>;
fn finish_connect(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(Resource<InputStream>, Resource<OutputStream>), SocketError>;
fn start_listen(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(), SocketError>;
fn finish_listen(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(), SocketError>;
fn accept(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(Resource<TcpSocket>, Resource<InputStream>, Resource<OutputStream>), SocketError>;
fn local_address(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpSocketAddress, SocketError>;
fn remote_address(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpSocketAddress, SocketError>;
fn address_family(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpAddressFamily>;
fn ipv6_only(
&mut self,
self_: Resource<TcpSocket>
) -> Result<bool, SocketError>;
fn set_ipv6_only(
&mut self,
self_: Resource<TcpSocket>,
value: bool
) -> Result<(), SocketError>;
fn set_listen_backlog_size(
&mut self,
self_: Resource<TcpSocket>,
value: u64
) -> Result<(), SocketError>;
fn keep_alive(
&mut self,
self_: Resource<TcpSocket>
) -> Result<bool, SocketError>;
fn set_keep_alive(
&mut self,
self_: Resource<TcpSocket>,
value: bool
) -> Result<(), SocketError>;
fn no_delay(
&mut self,
self_: Resource<TcpSocket>
) -> Result<bool, SocketError>;
fn set_no_delay(
&mut self,
self_: Resource<TcpSocket>,
value: bool
) -> Result<(), SocketError>;
fn unicast_hop_limit(
&mut self,
self_: Resource<TcpSocket>
) -> Result<u8, SocketError>;
fn set_unicast_hop_limit(
&mut self,
self_: Resource<TcpSocket>,
value: u8
) -> Result<(), SocketError>;
fn receive_buffer_size(
&mut self,
self_: Resource<TcpSocket>
) -> Result<u64, SocketError>;
fn set_receive_buffer_size(
&mut self,
self_: Resource<TcpSocket>,
value: u64
) -> Result<(), SocketError>;
fn send_buffer_size(
&mut self,
self_: Resource<TcpSocket>
) -> Result<u64, SocketError>;
fn set_send_buffer_size(
&mut self,
self_: Resource<TcpSocket>,
value: u64
) -> Result<(), SocketError>;
fn subscribe(
&mut self,
self_: Resource<TcpSocket>
) -> Result<Resource<Pollable>>;
fn shutdown(
&mut self,
self_: Resource<TcpSocket>,
shutdown_type: ShutdownType
) -> Result<(), SocketError>;
fn drop(&mut self, rep: Resource<TcpSocket>) -> Result<()>;
}
Required Methods§
sourcefn start_bind(
&mut self,
self_: Resource<TcpSocket>,
network: Resource<Network>,
local_address: IpSocketAddress
) -> Result<(), SocketError>
fn start_bind( &mut self, self_: Resource<TcpSocket>, network: Resource<Network>, local_address: IpSocketAddress ) -> Result<(), SocketError>
Bind the socket to a specific network on the provided IP address and port.
If the IP address is zero (0.0.0.0
in IPv4, ::
in IPv6), it is left to the implementation to decide which
network interface(s) to bind to.
If the TCP/UDP port is zero, the socket will be bound to a random free port.
When a socket is not explicitly bound, the first invocation to a listen or connect operation will implicitly bind the socket.
Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts.
Typical start
errors
invalid-argument
: Thelocal-address
has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows)invalid-argument
:local-address
is not a unicast address. (EINVAL)invalid-argument
:local-address
is an IPv4-mapped IPv6 address, but the socket hasipv6-only
enabled. (EINVAL)invalid-state
: The socket is already bound. (EINVAL)
Typical finish
errors
address-in-use
: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows)address-in-use
: Address is already in use. (EADDRINUSE)address-not-bindable
:local-address
is not an address that thenetwork
can bind to. (EADDRNOTAVAIL)not-in-progress
: Abind
operation is not in progress.would-block
: Can’t finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN)
References
fn finish_bind(&mut self, self_: Resource<TcpSocket>) -> Result<(), SocketError>
sourcefn start_connect(
&mut self,
self_: Resource<TcpSocket>,
network: Resource<Network>,
remote_address: IpSocketAddress
) -> Result<(), SocketError>
fn start_connect( &mut self, self_: Resource<TcpSocket>, network: Resource<Network>, remote_address: IpSocketAddress ) -> Result<(), SocketError>
Connect to a remote endpoint.
On success:
- the socket is transitioned into the Connection state
- a pair of streams is returned that can be used to read & write to the connection
POSIX mentions:
If connect() fails, the state of the socket is unspecified. Conforming applications should close the file descriptor and create a new socket before attempting to reconnect.
WASI prescribes the following behavior:
- If
connect
fails because an input/state validation error, the socket should remain usable. - If a connection was actually attempted but failed, the socket should become unusable for further network communication.
Besides
drop
, any method after such a failure may return an error.
Typical start
errors
invalid-argument
: Theremote-address
has the wrong address family. (EAFNOSUPPORT)invalid-argument
:remote-address
is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS)invalid-argument
:remote-address
is an IPv4-mapped IPv6 address, but the socket hasipv6-only
enabled. (EINVAL, EADDRNOTAVAIL on Illumos)invalid-argument
:remote-address
is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa)invalid-argument
: The IP address inremote-address
is set to INADDR_ANY (0.0.0.0
/::
). (EADDRNOTAVAIL on Windows)invalid-argument
: The port inremote-address
is set to 0. (EADDRNOTAVAIL on Windows)invalid-argument
: The socket is already attached to a different network. Thenetwork
passed toconnect
must be identical to the one passed tobind
.invalid-state
: The socket is already in the Connection state. (EISCONN)invalid-state
: The socket is already in the Listener state. (EOPNOTSUPP, EINVAL on Windows)
Typical finish
errors
timeout
: Connection timed out. (ETIMEDOUT)connection-refused
: The connection was forcefully rejected. (ECONNREFUSED)connection-reset
: The connection was reset. (ECONNRESET)connection-aborted
: The connection was aborted. (ECONNABORTED)remote-unreachable
: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN)address-in-use
: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD)not-in-progress
: Aconnect
operation is not in progress.would-block
: Can’t finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN)
References
fn finish_connect( &mut self, self_: Resource<TcpSocket> ) -> Result<(Resource<InputStream>, Resource<OutputStream>), SocketError>
sourcefn start_listen(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(), SocketError>
fn start_listen( &mut self, self_: Resource<TcpSocket> ) -> Result<(), SocketError>
Start listening for new connections.
Transitions the socket into the Listener state.
Unlike POSIX:
- this function is async. This enables interactive WASI hosts to inject permission prompts.
- the socket must already be explicitly bound.
Typical start
errors
invalid-state
: The socket is not bound to any local address. (EDESTADDRREQ)invalid-state
: The socket is already in the Connection state. (EISCONN, EINVAL on BSD)invalid-state
: The socket is already in the Listener state.
Typical finish
errors
address-in-use
: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE)not-in-progress
: Alisten
operation is not in progress.would-block
: Can’t finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN)
References
fn finish_listen( &mut self, self_: Resource<TcpSocket> ) -> Result<(), SocketError>
sourcefn accept(
&mut self,
self_: Resource<TcpSocket>
) -> Result<(Resource<TcpSocket>, Resource<InputStream>, Resource<OutputStream>), SocketError>
fn accept( &mut self, self_: Resource<TcpSocket> ) -> Result<(Resource<TcpSocket>, Resource<InputStream>, Resource<OutputStream>), SocketError>
Accept a new client socket.
The returned socket is bound and in the Connection state. The following properties are inherited from the listener socket:
address-family
ipv6-only
keep-alive
no-delay
unicast-hop-limit
receive-buffer-size
send-buffer-size
On success, this function returns the newly accepted client socket along with a pair of streams that can be used to read & write to the connection.
Typical errors
invalid-state
: Socket is not in the Listener state. (EINVAL)would-block
: No pending connections at the moment. (EWOULDBLOCK, EAGAIN)connection-aborted
: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED)new-socket-limit
: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE)
References
sourcefn local_address(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpSocketAddress, SocketError>
fn local_address( &mut self, self_: Resource<TcpSocket> ) -> Result<IpSocketAddress, SocketError>
Get the bound local address.
POSIX mentions:
If the socket has not been bound to a local name, the value stored in the object pointed to by
address
is unspecified.
WASI is stricter and requires local-address
to return invalid-state
when the socket hasn’t been bound yet.
Typical errors
invalid-state
: The socket is not bound to any local address.
References
sourcefn remote_address(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpSocketAddress, SocketError>
fn remote_address( &mut self, self_: Resource<TcpSocket> ) -> Result<IpSocketAddress, SocketError>
Get the remote address.
Typical errors
invalid-state
: The socket is not connected to a remote address. (ENOTCONN)
References
sourcefn address_family(
&mut self,
self_: Resource<TcpSocket>
) -> Result<IpAddressFamily>
fn address_family( &mut self, self_: Resource<TcpSocket> ) -> Result<IpAddressFamily>
Whether this is a IPv4 or IPv6 socket.
Equivalent to the SO_DOMAIN socket option.
sourcefn ipv6_only(&mut self, self_: Resource<TcpSocket>) -> Result<bool, SocketError>
fn ipv6_only(&mut self, self_: Resource<TcpSocket>) -> Result<bool, SocketError>
Whether IPv4 compatibility (dual-stack) mode is disabled or not.
Equivalent to the IPV6_V6ONLY socket option.
Typical errors
invalid-state
: (set) The socket is already bound.not-supported
: (get/set)this
socket is an IPv4 socket.not-supported
: (set) Host does not support dual-stack sockets. (Implementations are not required to.)
fn set_ipv6_only( &mut self, self_: Resource<TcpSocket>, value: bool ) -> Result<(), SocketError>
sourcefn set_listen_backlog_size(
&mut self,
self_: Resource<TcpSocket>,
value: u64
) -> Result<(), SocketError>
fn set_listen_backlog_size( &mut self, self_: Resource<TcpSocket>, value: u64 ) -> Result<(), SocketError>
Hints the desired listen queue size. Implementations are free to ignore this.
Typical errors
not-supported
: (set) The platform does not support changing the backlog size after the initial listen.invalid-state
: (set) The socket is already in the Connection state.
sourcefn keep_alive(
&mut self,
self_: Resource<TcpSocket>
) -> Result<bool, SocketError>
fn keep_alive( &mut self, self_: Resource<TcpSocket> ) -> Result<bool, SocketError>
Equivalent to the SO_KEEPALIVE socket option.
fn set_keep_alive( &mut self, self_: Resource<TcpSocket>, value: bool ) -> Result<(), SocketError>
sourcefn no_delay(&mut self, self_: Resource<TcpSocket>) -> Result<bool, SocketError>
fn no_delay(&mut self, self_: Resource<TcpSocket>) -> Result<bool, SocketError>
Equivalent to the TCP_NODELAY socket option.
The default value is false
.
fn set_no_delay( &mut self, self_: Resource<TcpSocket>, value: bool ) -> Result<(), SocketError>
sourcefn unicast_hop_limit(
&mut self,
self_: Resource<TcpSocket>
) -> Result<u8, SocketError>
fn unicast_hop_limit( &mut self, self_: Resource<TcpSocket> ) -> Result<u8, SocketError>
Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options.
Typical errors
invalid-argument
: (set) The TTL value must be 1 or higher.invalid-state
: (set) The socket is already in the Connection state.invalid-state
: (set) The socket is already in the Listener state.
fn set_unicast_hop_limit( &mut self, self_: Resource<TcpSocket>, value: u8 ) -> Result<(), SocketError>
sourcefn receive_buffer_size(
&mut self,
self_: Resource<TcpSocket>
) -> Result<u64, SocketError>
fn receive_buffer_size( &mut self, self_: Resource<TcpSocket> ) -> Result<u64, SocketError>
The kernel buffer space reserved for sends/receives on this socket.
Note #1: an implementation may choose to cap or round the buffer size when setting the value. In other words, after setting a value, reading the same setting back may return a different value.
Note #2: there is not necessarily a direct relationship between the kernel buffer size and the bytes of actual data to be sent/received by the application, because the kernel might also use the buffer space for internal metadata structures.
Equivalent to the SO_RCVBUF and SO_SNDBUF socket options.
Typical errors
invalid-state
: (set) The socket is already in the Connection state.invalid-state
: (set) The socket is already in the Listener state.
fn set_receive_buffer_size( &mut self, self_: Resource<TcpSocket>, value: u64 ) -> Result<(), SocketError>
fn send_buffer_size( &mut self, self_: Resource<TcpSocket> ) -> Result<u64, SocketError>
fn set_send_buffer_size( &mut self, self_: Resource<TcpSocket>, value: u64 ) -> Result<(), SocketError>
sourcefn subscribe(
&mut self,
self_: Resource<TcpSocket>
) -> Result<Resource<Pollable>>
fn subscribe( &mut self, self_: Resource<TcpSocket> ) -> Result<Resource<Pollable>>
Create a pollable
which will resolve once the socket is ready for I/O.
Note: this function is here for WASI Preview2 only.
It’s planned to be removed when future
is natively supported in Preview3.
sourcefn shutdown(
&mut self,
self_: Resource<TcpSocket>,
shutdown_type: ShutdownType
) -> Result<(), SocketError>
fn shutdown( &mut self, self_: Resource<TcpSocket>, shutdown_type: ShutdownType ) -> Result<(), SocketError>
Initiate a graceful shutdown.
- receive: the socket is not expecting to receive any more data from the peer. All subsequent read
operations on the
input-stream
associated with this socket will return an End Of Stream indication. Any data still in the receive queue at time of callingshutdown
will be discarded. - send: the socket is not expecting to send any more data to the peer. All subsequent write
operations on the
output-stream
associated with this socket will return an error. - both: same effect as receive & send combined.
The shutdown function does not close (drop) the socket.
Typical errors
invalid-state
: The socket is not in the Connection state. (ENOTCONN)