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