我创建了tokio_core::net::TcpListener
,然后调用incoming
方法来获取传入连接流。然后,我使用该流上的for_each
方法将其转换为未来,并在事件循环中运行未来。一旦我这样做,有什么方法可以在稍后的时间从端口解除绑定?
如果没有,Tokio中是否还有其他API可用于创建可以关闭的TCP服务器?
答案 0 :(得分:3)
简而言之,您需要删除TcpListener
返回的Future
/ for_each
。
你可以:
为包含应用程序其余部分状态的某个结构编写Future
实现。您的结构的Future::poll
实现然后poll
包含所有Future
个状态,如果您想提前退出,则返回Async::Ready
。如果包含的Future
包含在oneshot::spawn
中以在自己的任务中运行,则可能有助于提高性能。
您的结构将包含Option<SpawnHandle<(), ...>>
。如果您想停止收听,只需将其设置为None
。
incoming
流。 (Arc<AtomicBool>
)标记是否继续使用Stream::take_while
for_each
处理程序的末尾是否继续侦听并返回错误(否则会停止for_each
循环)后两种方法仅在查看/处理传入连接后停止,因此它们仅在繁忙的环境中工作。
答案 1 :(得分:2)
这是我最近发现的另一种选择。
您基本上需要放弃TcpListener
/ for_each
将来停止收听。由于它永远不会自行完成,只需使用oneshot::Receiver<()>
将其与您控制的另一个未来(例如select()
)结合使用。如果侦听器完成(从不)或者oneshot接收到一个值(您可以通过向另一端发送内容来触发),则返回的未来将完成。