7

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

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

4

2 回答 2

4

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

你可以:

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

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

  • incoming通过检查一些“全局”( )标志来过滤流Arc<AtomicBool>是否继续使用Stream::take_while
  • 在处理程序结束时检查for_each是否继续侦听并返回错误(停止for_each循环)

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

于 2018-01-19T08:24:08.913 回答
4

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

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

对于需要关闭多个事物的更复杂的程序,还有一个带有一个和多个s的watch通道。SenderReceiver<()>

还有一些建议可以让期货箱本身更容易做到这一点

于 2018-01-22T09:05:10.757 回答