2012-04-05 270 views
2

我有一个使用asio的异步TCP/IP客户端。当连接丢失时,async_read的句柄函数会收到错误。所以我得知连接丢失了。boost asio:如何监控tcp连接是否有效

现在,我重构了一些遗留代码,实现了一个同步TCP/IP客户端,其中抽象接口强制执行此序列:同步写入,然后是同步读取。 用asio做这件事很简单,但我想知道异步如果连接丢失。

有没有更优雅的方式比:

选项A: 添加,检查线程如果套接字仍然活着(通过尝试读取...但我怎么能肯定的是,读不从我的同步读窃取数据见Boost asio ip tcp iostream Error Detection

选项B: 使用async_read代替和,并模拟同步阅读

+0

我认为答案是否定的。但也许有一些特定于平台的解决方案。 – mirk 2012-04-05 13:49:12

+0

我不认为TCP协议可以检测到连接失败,除非它在特定的时间范围内未收到对发送的数据包的确认。 – Ferruccio 2012-04-05 23:18:01

+0

我已经实现了选项B.但是,有两件事我不明白1.断开连接未被检测到2.如果我拔掉了服务器(即打印机)的以太网电缆,我仍然可以发送数据并且它不返回错误。只有第二次,它会抛出一个错误 – DoogQc 2012-04-06 20:08:56

回答

2

我会想象的SYN慢性操作将会像异步操作一样失败。当同步失败时,它可能会更具破坏性,因为超时可能非常长,并且在其他所有事情都必须等待时会更明显。

您可能想要考虑在套接字上启用TCP保持活动并可能降低TCP保持活动时间间隔以更快地检测丢失的连接。

+0

值得一提; TCP-keepalive有一些限制,最值得注意的是没有便携的方式(据我所知)设置keepalive的超时时间。而且,默认的超时时间非常长。例如,在Linux上,默认的保活时间间隔为2小时,在连接被认为死亡之前,9个探测器必须失败。 – Rawler 2012-04-08 18:31:14

+0

其实质是,在大多数情况下,您必须求助于在您的应用程序代码中处理连接超时问题,如果可能的话将“心跳” - 检查添加到协议中,并尝试为超时设定默认值。 (“这个操作真的需要5秒钟吗?”等)“) – Rawler 2012-04-08 18:32:19

相关问题