gpt4 book ai didi

c++ - boost::asio::ip::tcp::socket 已连接?

转载 作者:IT老高 更新时间:2023-10-28 22:01:21 24 4
gpt4 key购买 nike

我想在执行读/写操作之前验证连接状态。

有没有办法制作 isConnect() 方法?

我看到了this ,但看起来“丑”。

我已经测试过 is_open()功能也一样,但它没有预期的行为。

最佳答案

TCP 的目的是在严苛的网络面前保持稳健;尽管 TCP 提供了看起来像持久的端到端连接,但这一切都只是一个谎言,每个数据包实际上只是一个唯一的、不可靠的数据报。

连接实际上只是在连接的每一端(源和目标端口和地址,以及本地套接字)跟踪的一些状态创建的虚拟管道。网络堆栈使用此状态来了解将每个传入数据包分配给哪个进程以及将哪个状态放入每个传出数据包的 header 中。

Virtual TCP Conduit

由于网络的底层——本质上是无连接和不可靠的——性质,堆栈只会在远程端发送一个 FIN 数据包关闭连接时,或者如果它没有收到一个 ACK​​ 响应来报告断开连接发送的数据包(在超时和几次重试之后)。

由于 asio 的异步特性,收到正常断开连接通知的最简单方法是拥有一个未完成的 async_read,它会在以下情况下立即返回 error::eof连接关闭。但仅此一点仍然可能导致其他问题,如连接半开和网络问题未被检测到。

解决意外连接中断的最有效方法是使用某种保持事件状态或 ping。这种通过连接传输数据的偶尔尝试可以方便地检测到意外断开的连接。

TCP协议(protocol)其实有一个内置的keep-alive mechanism可以在 asio 中使用 asio::tcp::socket::keep_alive 进行配置。 TCP keep-alive 的好处是它对用户模式应用程序是透明的,只有对 keep-alive 感兴趣的对等方才需要配置它。缺点是您需要操作系统级别的访问/知识来配置超时参数,遗憾的是它们没有通过简单的套接字选项公开,并且通常具有非常大的默认超时值(Linux 上为 7200 秒)。

可能最常见的保持事件状态的方法是在应用程序层实现它,其中应用程序有一个特殊的 noop 或 ping 消息,除了在痒痒时响应之外什么都不做。此方法为您实现保活策略提供了最大的灵 active 。

关于c++ - boost::asio::ip::tcp::socket 已连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511129/

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