use std::net::SocketAddr;
use socket2::Domain;
use tokio::net::{TcpListener, TcpStream};
pub struct IncomingStream {
listener: TcpListener,
}
impl IncomingStream {
pub async fn bind(addr: SocketAddr) -> std::io::Result<Self> {
let socket = socket2::Socket::new(
Domain::for_address(addr),
socket2::Type::STREAM,
Some(socket2::Protocol::TCP),
)
.expect("Failed to create a socket");
socket.set_reuse_address(true)?;
socket.set_nonblocking(true)?;
socket.bind(&addr.into())?;
socket.listen(1024_i32)?;
let listener = std::net::TcpListener::from(socket);
Ok(Self {
listener: TcpListener::from_std(listener)?,
})
}
pub fn local_addr(&self) -> std::io::Result<SocketAddr> {
self.listener.local_addr()
}
pub async fn accept(&self) -> std::io::Result<(TcpStream, SocketAddr)> {
self.listener.accept().await
}
}
impl TryFrom<std::net::TcpListener> for IncomingStream {
type Error = std::io::Error;
fn try_from(v: std::net::TcpListener) -> std::io::Result<Self> {
v.set_nonblocking(true)?;
Ok(Self {
listener: TcpListener::from_std(v)?,
})
}
}
impl From<TcpListener> for IncomingStream {
fn from(v: TcpListener) -> Self {
Self { listener: v }
}
}