gpt4 book ai didi

c++ - boost tcp 接受器和 boost tcp 套接字的 keep_alive 选项

转载 作者:可可西里 更新时间:2023-11-01 02:35:35 29 4
gpt4 key购买 nike

我有几个问题,都与keep_alive有关。

  • basic_socket_acceptor::keep_alive 之间有什么区别?和 basic_stream_socket::keep_alive ?什么时候使用哪个?
  • 我们是否需要为 ip::tcp::acceptor 使用任何类型的 keep_alive ?这对我来说没有意义,因为接受器本身没有没有连接,但也有一个keep_alive 选项,因此困惑。
  • 如果设置了keep_alive,那么当Boost Asio 检测到连接中断时,它的行为是什么?它如何/何时通知用户代码?它会抛出异常吗?如果是这样,哪个异常(exception)?我在文档中没有看到任何此类详细信息。

最佳答案

What is the difference between basic_socket_acceptor::keep_alive and basic_stream_socket::keep_alive? When to use which?

两者是一样的。在文档中,它出现在 basic_socket_acceptorbasic_stream_socket 下,因为它们都是从 socket_base 派生的,其中 keepalive 选项实际上是可见(这是一个 typedef)。

根据文档中的示例,您将始终像这样使用它:

boost::asio::socket_base::keep_alive option(true);
socket.set_option(option);

Do we need to use any kind of keep_alive for ip::tcp::acceptor?

不,你不必也不能。 set_option 无论如何只能在套接字对象上调用(我相信只有在套接字被打开之后)。

If keep_alive is set, then what is the behaviour of Boost Asio when it detects broken connection?

这取决于平台。在 linux 上,当 keep_alive 探测失败时,您将收到 broken pipe 错误或 EPOLLERR/EPOLLHUP

更新(来 self 下面的评论):

此失败不会传播到用户代码。因此,您可能需要实现应用程序级别的 ping 或使用超时套接字选项。

关于c++ - boost tcp 接受器和 boost tcp 套接字的 keep_alive 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434991/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com