kvarn_extensions/
connection.rsuse kvarn::prelude::*;
use std::net::{Ipv4Addr, SocketAddrV4};
#[cfg(unix)]
use tokio::net::UnixStream;
use tokio::net::{TcpStream, UdpSocket};
macro_rules! socket_addr_with_port {
($($port:literal $(,)+)*) => {
&[
$(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, $port)),)*
]
};
}
#[derive(Debug, Clone)]
pub enum Connection {
Tcp(SocketAddr),
Udp(SocketAddr),
#[cfg(unix)]
UnixSocket(String),
}
impl Connection {
pub async fn establish(self) -> io::Result<EstablishedConnection> {
match self {
Self::Tcp(addr) => TcpStream::connect(addr)
.await
.map(EstablishedConnection::Tcp),
Self::Udp(addr) => {
let candidates = &socket_addr_with_port!(
17448, 64567, 40022, 56654, 52027, 44328, 29973, 27919, 26513, 42327, 64855,
5296, 52942, 43204, 15322, 13243,
)[..];
let socket = UdpSocket::bind(candidates).await?;