2 use async_std::net::{SocketAddr, TcpListener, ToSocketAddrs};
3 use async_std::pin::Pin;
5 use futures::task::{Context, Poll};
6 use futures::{Stream, StreamExt};
10 pub struct TcpServer {
11 local_addrs: SocketAddr,
12 listener: TcpListener,
16 pub fn new<A: ToSocketAddrs + std::fmt::Display>(ip_addrs: A) -> anyhow::Result<Self> {
17 let listener = task::block_on(TcpListener::bind(&ip_addrs))?;
18 info!("Started TCP server at {}", &ip_addrs);
21 local_addrs: listener.local_addr()?,
27 impl Stream for TcpServer {
28 type Item = Connection;
30 fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
31 if let Some(Ok(conn)) = futures::executor::block_on(self.listener.incoming().next()) {
33 "Received connection attempt from {}",
35 .expect("Peer address could not be retrieved")
37 Poll::Ready(Some(Connection::from(conn)))
39 debug!("Shutting TCP server down at {}", self.local_addrs);