use std::net::SocketAddr;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct TcpListenerConfig {
bind: SocketAddr,
ipv6_only: Option<bool>,
}
pub fn std_tcp_listener_from_config(
cfg: &TcpListenerConfig,
) -> std::io::Result<std::net::TcpListener> {
let domain = socket2::Domain::for_address(cfg.bind);
let sock = socket2::Socket::new(domain, socket2::Type::STREAM, None)?;
if let Some(ipv6_only) = cfg.ipv6_only {
sock.set_only_v6(ipv6_only)?;
}
sock.set_reuse_address(true)?;
sock.bind(&cfg.bind.into())?;
sock.listen(128)?;
sock.set_nonblocking(true)?;
Ok(sock.into())
}
pub fn tokio_tcp_listener_from_config(
cfg: &TcpListenerConfig,
) -> std::io::Result<tokio::net::TcpListener> {
let std_sock = std_tcp_listener_from_config(cfg)?;
let tokio_sock = tokio::net::TcpListener::from_std(std_sock)?;
Ok(tokio_sock)
}
pub fn hyper_addr_incoming_from_config(
cfg: &TcpListenerConfig,
) -> anyhow::Result<hyper::server::conn::AddrIncoming> {
let tokio_sock = tokio_tcp_listener_from_config(cfg)?;
let hyper_addr_incoming = hyper::server::conn::AddrIncoming::from_listener(tokio_sock)?;
Ok(hyper_addr_incoming)
}