【发布时间】:2011-05-20 14:44:22
【问题描述】:
据我所知,TCP 套接字上的阻塞接收并不总是通过返回 -1 值或引发 IO 异常来检测连接错误(由于网络故障或远程端点故障):有时它可能会无限期挂起。
解决此问题的一种方法是为阻塞接收设置超时。如果接收时间的上限已知,则可以将此限制设置为超时,并且在超时到期时可以认为连接丢失;当这样的上限事先不知道时,例如在一个连接保持打开以接收发布的 pub-sub 系统中,设置的超时会有些随意,但它的到期可能会触发一个 ping/pong 请求来验证连接(以及端点)仍在运行。
我想知道使用异步接收是否还可以解决检测连接失败的问题。在 boost::asio 中,我会调用 socket::asynch_read_some() 注册一个异步调用的处理程序,而在 java.nio 中,我会将通道配置为非阻塞并将其注册到带有 OP_READ 兴趣标志的选择器。我想正确的连接失败检测意味着,在第一种情况下,将使用非 0 错误代码调用处理程序,而在第二种情况下,选择器将选择有故障的通道,但随后在通道上出现 read()要么返回-1,要么抛出IOException。
异步接收是否保证了这种行为,或者是否存在连接失败后的情况,例如,在 boost::asio 中,处理程序永远不会被调用,或者在 java.nio 中,选择器永远不会选择通道?
非常感谢。
【问题讨论】:
标签: tcp connection boost-asio nio