0

我正在使用 IMAP 服务器,其中一项操作是升级连接以使用 TLS(通过STARTTLS命令)。我们当前的架构有一个 goroutine 从套接字读取数据,解析命令,然后通过通道发送逻辑命令。另一个 goroutine 从该通道读取并执行命令。这通常很好用。

但是,在执行STARTTLS时,我们需要停止当前正在进行的Read()调用,否则这Read()将消耗 TLS 握手中的字节。我们可以在两者之间插入另一个类,但是那个类将在Read()调用时被阻塞,我们遇到了同样的问题。如果网络连接是一个通道,我们可以添加另一个信号通道并使用一个select{}块来停止读取,但网络连接不是通道(只需将其包装在一个 goroutine 中,通道只是将问题转移到该 goroutine)。

有没有办法在Read()呼叫开始后停止呼叫,而无需等待超时或类似的东西?

4

2 回答 2

0

Read()call 依赖于你的操作系统行为。它的行为依赖于套接字行为。

如果你熟悉 socket 接口(这几乎是操作系统之间的标准,有一些小的差异),你会发现使用 socket 的同步通信模式,read系统调用总是阻塞线程的执行,直到超时值到期,你可以不要改变这种行为。

Go 在底层使用同步 I/O 来满足其所有需求,因为 goroutine 使异步通信在设计上不需要。

还有一种方法可以打破read:通过手动关闭套接字,这不是代码的最佳设计决策,并且在您的特定情况下。所以我认为你应该更好地使用更小的超时,或者重新设计你的代码以其他方式工作。

于 2013-07-29T10:43:01.650 回答
0

除非您或连接,否则您确实无法停止Read通话。SetReadDeadlineClose

你可以做的一件事是用bufio包缓冲它。这将允许您在不实际读取缓冲区的情况下进行Peek 。Peek将像 dos 一样阻止Read,但允许您决定当有内容可供阅读时要执行的操作。

于 2013-08-05T04:37:06.990 回答