繁体   English   中英

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

[英]C++ Can I make boost::asio connection socket without timer?

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

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

警告:伪代码前面。

你可以做到的。 但这并不像您希望的那样直接。 您需要从客户端使用async_connect()才能阻止。 然后,您还需要将deadline_timer设置为您认为合适的任何超时时间。 零将不起作用,您需要给async_connect()一些时间。 但是我猜一两秒应该没问题。

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

注意,插座不会因此而被关闭。 理想情况下,每当传递的error_code表示否定结果时,您都将在async_connect的处理程序中将其关闭。 例如,如果取消了该处理程序,则将以OPERATION_ABORTED作为error_code调用该处理程序。

当然,如果仅进行检查,则可以在cancel()之后在计时器处理程序中close()套接字。 但这会在async_connect由于其他原因而失败时为您提供一个开放的套接字。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM