是否可以在Tokio中关闭TcpListener?

时间:2018-01-19 04:21:14

标签: rust rust-tokio

我创建了tokio_core::net::TcpListener,然后调用incoming方法来获取传入连接流。然后,我使用该流上的for_each方法将其转换为未来,并在事件循环中运行未来。一旦我这样做,有什么方法可以在稍后的时间从端口解除绑定?

如果没有,Tokio中是否还有其他API可用于创建可以关闭的TCP服务器?

2 个答案:

答案 0 :(得分:3)

简而言之,您需要删除TcpListener返回的Future / for_each

你可以:

  • 为包含应用程序其余部分状态的某个结构编写Future实现。您的结构的Future::poll实现然后poll包含所有Future个状态,如果您想提前退出,则返回Async::Ready。如果包含的Future包含在oneshot::spawn中以在自己的任务中运行,则可能有助于提高性能。

    您的结构将包含Option<SpawnHandle<(), ...>>。如果您想停止收听,只需将其设置为None

  • 通过检查一些&#34; global&#34;过滤incoming流。 (Arc<AtomicBool>)标记是否继续使用Stream::take_while
  • 进行收听
  • 检查for_each处理程序的末尾是否继续侦听并返回错误(否则会停止for_each循环)

后两种方法仅在查看/处理传入连接后停止,因此它们仅在繁忙的环境中工作。

答案 1 :(得分:2)

这是我最近发现的另一种选择。

您基本上需要放弃TcpListener / for_each将来停止收听。由于它永远不会自行完成,只需使用oneshot::Receiver<()>将其与您控制的另一个未来(例如select())结合使用。如果侦听器完成(从不)或者oneshot接收到一个值(您可以通过向另一端发送内容来触发),则返回的未来将完成。

还有make this easier in the futures crate itself的建议。