Struct Endpoint
pub struct Endpoint {
pub(crate) inner: EndpointRef,
pub(crate) default_client_config: Option<ClientConfig>,
runtime: Arc<dyn Runtime>,
}Expand description
A QUIC endpoint.
An endpoint corresponds to a single UDP socket, may host many connections, and may act as both client and server for different connections.
May be cloned to obtain another handle to the same endpoint.
Fields§
§inner: EndpointRef§default_client_config: Option<ClientConfig>§runtime: Arc<dyn Runtime>Implementations§
§impl Endpoint
impl Endpoint
pub fn client(addr: SocketAddr) -> Result<Endpoint, Error>
pub fn client(addr: SocketAddr) -> Result<Endpoint, Error>
Helper to construct an endpoint for use with outgoing connections only
Note that addr is the local address to bind to, which should usually be a wildcard address like 0.0.0.0:0 or [::]:0, which allow communication with any reachable IPv4 or IPv6 address respectively from an OS-assigned port.
If an IPv6 address is provided, attempts to make the socket dual-stack so as to allow communication with both IPv4 and IPv6 addresses. As such, calling Endpoint::client with the address [::]:0 is a reasonable default to maximize the ability to connect to other address. For example:
quinn::Endpoint::client((std::net::Ipv6Addr::UNSPECIFIED, 0).into());Some environments may not allow creation of dual-stack sockets, in which case an IPv6 client will only be able to connect to IPv6 servers. An IPv4 client is never dual-stack.
pub fn stats(&self) -> EndpointStats
pub fn stats(&self) -> EndpointStats
Returns relevant stats from this Endpoint
pub fn server(config: ServerConfig, addr: SocketAddr) -> Result<Endpoint, Error>
pub fn server(config: ServerConfig, addr: SocketAddr) -> Result<Endpoint, Error>
Helper to construct an endpoint for use with both incoming and outgoing connections
Platform defaults for dual-stack sockets vary. For example, any socket bound to a wildcard IPv6 address on Windows will not by default be able to communicate with IPv4 addresses. Portable applications should bind an address that matches the family they wish to communicate within.
pub fn new( config: EndpointConfig, server_config: Option<ServerConfig>, socket: UdpSocket, runtime: Arc<dyn Runtime>, ) -> Result<Endpoint, Error>
pub fn new( config: EndpointConfig, server_config: Option<ServerConfig>, socket: UdpSocket, runtime: Arc<dyn Runtime>, ) -> Result<Endpoint, Error>
Construct an endpoint with arbitrary configuration and socket
pub fn new_with_abstract_socket( config: EndpointConfig, server_config: Option<ServerConfig>, socket: Arc<dyn AsyncUdpSocket>, runtime: Arc<dyn Runtime>, ) -> Result<Endpoint, Error>
pub fn new_with_abstract_socket( config: EndpointConfig, server_config: Option<ServerConfig>, socket: Arc<dyn AsyncUdpSocket>, runtime: Arc<dyn Runtime>, ) -> Result<Endpoint, Error>
Construct an endpoint with arbitrary configuration and pre-constructed abstract socket
Useful when socket has additional state (e.g. sidechannels) attached for which shared ownership is needed.
pub fn accept(&self) -> Accept<'_>
pub fn accept(&self) -> Accept<'_>
Get the next incoming connection attempt from a client
Yields [Incoming]s, or None if the endpoint is closed. [Incoming] can be awaited to obtain the final Connection, or used to e.g. filter connection attempts or force address validation, or converted into an intermediate Connecting future which can be used to e.g. send 0.5-RTT data.
pub fn set_default_client_config(&mut self, config: ClientConfig)
pub fn set_default_client_config(&mut self, config: ClientConfig)
Set the client configuration used by connect
pub fn connect( &self, addr: SocketAddr, server_name: &str, ) -> Result<Connecting, ConnectError>
pub fn connect( &self, addr: SocketAddr, server_name: &str, ) -> Result<Connecting, ConnectError>
Connect to a remote endpoint
server_name must be covered by the certificate presented by the server. This prevents a connection from being intercepted by an attacker with a valid certificate for some other server.
May fail immediately due to configuration errors, or in the future if the connection could not be established.
pub fn connect_with( &self, config: ClientConfig, addr: SocketAddr, server_name: &str, ) -> Result<Connecting, ConnectError>
pub fn connect_with( &self, config: ClientConfig, addr: SocketAddr, server_name: &str, ) -> Result<Connecting, ConnectError>
Connect to a remote endpoint using a custom configuration.
See connect() for details.
pub fn rebind(&self, socket: UdpSocket) -> Result<(), Error>
pub fn rebind(&self, socket: UdpSocket) -> Result<(), Error>
Switch to a new UDP socket
See Endpoint::rebind_abstract() for details.
pub fn rebind_abstract( &self, socket: Arc<dyn AsyncUdpSocket>, ) -> Result<(), Error>
pub fn rebind_abstract( &self, socket: Arc<dyn AsyncUdpSocket>, ) -> Result<(), Error>
Switch to a new UDP socket
Allows the endpoint’s address to be updated live, affecting all active connections. Incoming connections and connections to servers unreachable from the new address will be lost.
On error, the old UDP socket is retained.
pub fn set_server_config(&self, server_config: Option<ServerConfig>)
pub fn set_server_config(&self, server_config: Option<ServerConfig>)
Replace the server configuration, affecting new incoming connections only
Useful for e.g. refreshing TLS certificates without disrupting existing connections.
pub fn local_addr(&self) -> Result<SocketAddr, Error>
pub fn local_addr(&self) -> Result<SocketAddr, Error>
Get the local SocketAddr the underlying socket is bound to
pub fn open_connections(&self) -> usize
pub fn open_connections(&self) -> usize
Get the number of connections that are currently open
pub fn close(&self, error_code: VarInt, reason: &[u8])
pub fn close(&self, error_code: VarInt, reason: &[u8])
Close all of this endpoint’s connections immediately and cease accepting new connections.
See Connection::close() for details.
pub async fn wait_idle(&self)
pub async fn wait_idle(&self)
Wait for all connections on the endpoint to be cleanly shut down
Waiting for this condition before exiting ensures that a good-faith effort is made to notify peers of recent connection closes, whereas exiting immediately could force them to wait out the idle timeout period.
Does not proactively close existing connections or cause incoming connections to be rejected. Consider calling close() if that is desired.