我正在使用 IMAP 服务器,其中一项操作是升级连接以使用 TLS(通过STARTTLS
命令)。我们当前的架构有一个 goroutine 从套接字读取数据,解析命令,然后通过通道发送逻辑命令。另一个 goroutine 从该通道读取并执行命令。这通常很好用。
但是,在执行STARTTLS
时,我们需要停止当前正在进行的Read()
调用,否则这Read()
将消耗 TLS 握手中的字节。我们可以在两者之间插入另一个类,但是那个类将在Read()
调用时被阻塞,我们遇到了同样的问题。如果网络连接是一个通道,我们可以添加另一个信号通道并使用一个select{}
块来停止读取,但网络连接不是通道(只需将其包装在一个 goroutine 中,通道只是将问题转移到该 goroutine)。
有没有办法在Read()
呼叫开始后停止呼叫,而无需等待超时或类似的东西?