我有一个窗口服务器套接字和一个 Linux 客户端套接字。客户端连接到服务器并发送消息。之后,服务器将调用外部可执行文件。问题是:当服务器不可用时,客户端在连接功能时因超时而阻塞,但我不想要它。我希望如果没有建立连接,客户端套接字将立即关闭。
有人可以给我一些建议吗?
我有一个窗口服务器套接字和一个 Linux 客户端套接字。客户端连接到服务器并发送消息。之后,服务器将调用外部可执行文件。问题是:当服务器不可用时,客户端在连接功能时因超时而阻塞,但我不想要它。我希望如果没有建立连接,客户端套接字将立即关闭。
有人可以给我一些建议吗?
警告:前面有伪代码。
你可以这样做。但这并不像您希望的那样直截了当。您需要async_connect()
从您的客户那里使用才能不阻止。然后,您还需要deadline_timer
设置您认为合适的任何超时。零是行不通的,你需要给async_connect()
一些时间。但我想一两秒应该没问题。
然后计时器处理程序将必须对cancel()
套接字进行所有异步操作(您需要确保这只是连接,如果需要,请使用更多套接字)。
请注意,套接字不会因此而关闭。async_connect
理想情况下,只要传递的 error_code 指示否定结果,您将在处理程序中关闭它。例如,如果它被取消,将使用 OPERATION_ABORTED 作为 error_code 调用处理程序。
当然,如果你只检查那个,你也可以close()
在cancel()
. async_connect
但是,每当由于其他原因失败时,这会给您留下一个打开的套接字。
我会从您的问题中假设您希望您的套接字在async_connect()
传递任何错误代码但成功时关闭。SUCCESS 是唯一一个在用作布尔值时隐式转换为 0 的 error_code,因此在处理程序中检查它很容易。^^
不要忘记deadline_timer
在 的处理程序中取消,async_connect()
并确保在关闭套接字之前没有使用 OPERATION_ABORTED 调用计时器处理程序。^^