【发布时间】:2015-05-25 16:44:48
【问题描述】:
Go 中使 TCP 会话超时的惯用方式是什么,例如初始协议握手?假设有一个处理 TCP 会话的 goroutine。我可以启动它,然后启动time.After(),然后为它们两个启动select,如果超时,继续做其他事情。
但是,这意味着 TCP goroutine 将在超时后继续保持 TCP 连接处于活动状态,即使没有人需要它。
【问题讨论】:
Go 中使 TCP 会话超时的惯用方式是什么,例如初始协议握手?假设有一个处理 TCP 会话的 goroutine。我可以启动它,然后启动time.After(),然后为它们两个启动select,如果超时,继续做其他事情。
但是,这意味着 TCP goroutine 将在超时后继续保持 TCP 连接处于活动状态,即使没有人需要它。
【问题讨论】:
要使初始连接超时,请使用net.DialTimeout,或者更具体地说,在net.Dialer 上设置Timeout 参数。
要在 TCP 连接正在使用时使单个操作超时,请在连接上使用 SetDeadline、SetReadDeadline 或 SetWriteDeadline。
如果您需要立即取消对连接的操作,在 Go 中执行此操作的方法是 Close() 连接。连接对于并发操作是安全的,您可以从一个 goroutine 调用 Close(),而不是阻塞网络操作。
【讨论】: