C ++我可以在没有计时器的情况下制作boost :: asio连接套接字吗?

时间:2013-11-14 13:33:21

标签: c++ sockets boost boost-asio connection-timeout

我有一个窗口服务器套接字和一个Linux客户端套接字。客户端连接到服务器并发送消息。之后,服务器将调用外部可执行文件。问题是:当服务器不可用时,客户端在连接功能时阻塞超时,但我不想要它。我希望如果没有建立连接,客户端套接字将立即关闭。

有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

警告:伪代码提前。

你可以做到这一点。但它并不像你希望的那样直截了当。 您需要使用客户端的async_connect()来阻止。然后,您还需要deadline_timer设置为您认为合适的超时。零不起作用,你需要给async_connect()一些时间。但我想一两秒钟就可以了。

然后,定时器处理程序必须cancel()对套接字执行所有异步操作(您需要确保只是连接,如果需要,请使用更多套接字)。

请注意套接字不会被关闭。理想情况下,只要传递的error_code指示否定结果,您将在async_connect的处理程序中将其关闭。例如,如果它被取消,则将使用OPERATION_ABORTED作为error_code调用处理程序。

当然,如果你只检查它,你也可以在close()后的定时器处理程序中cancel()套接字。但是,只要async_connect由于其他原因失败,那就会给你一个开放的套接字。

我会从您的问题中假设,只要async_connect()传递任何error_code但SUCCESS,您希望套接字关闭。并且当用作布尔值时,SUCCESS是唯一隐式转换为0的error_code,因此在处理程序中检查它很容易。 ^^

不要忘记取消deadline_timer处理程序中的async_connect()并确保在关闭套接字之前未使用OPERATION_ABORTED调用计时器处理程序。 ^^