gpt4 book ai didi

boost-asio - 应该如何拆除 boost::asio::ip::udp::socket?

转载 作者:行者123 更新时间:2023-12-03 07:00:29 38 4
gpt4 key购买 nike

我已经阅读了 boost asio 引用资料,浏览了教程并查看了一些示例。尽管如此,我还是看不出应该如何拆除套接字:

  1. 我应该调用 close() 还是由套接字的析构函数完成?
  2. 什么时候应该调用 shutdown()
  3. shutdown() 有什么作用?我知道它“禁用发送或接收”,但这是如何完成的?如果在禁用套接字后使用套接字发送或接收,会发生什么?
  4. close() 可能会出现哪些错误

最佳答案

由于这是一个多问题,我会尽力回答每个部分,让您满意:

1) 根据我使用 ASIO 套接字的经验,析构函数会处理关闭套接字。不过,我只处理过 TCP 套接字。检查这一点的最佳方法是简单地查看析构函数的代码,看看它是否执行了类似于关闭的操作。我知道 Boost 代码可能有点难以完成,因此最简单的方法可能是简单地创建一个打开 UDP 套接字然后销毁它的小示例程序。这样您就可以在调试器中单步执行代码以遵循逻辑。

由于 Boost 的设计者在 TCP 套接字上考虑了这一点,所以我很难想象他们不会对 UDP 套接字做同样的事情。

2) 仅当您认为有必要阻止任何代码执行 future 的 recv 和/或 send 时,才调用 shutdown() socket 。它通常不是必需的,尽管我看到它在 TCP 套接字上使用来强制套接字在关闭时发送 RST(与处理待处理发送的默认“优雅”关闭相反) .

3) 您可以将套接字视为一种双 channel 通信形式:一个用于读取,另一个用于发送。您可以独立地关闭其中一个 channel ,并且可以在另一个 channel 关闭时继续使用一个 channel (即,在关闭发送后您仍然可以接收,反之亦然)。关闭套接字与在接收和发送上调用 shutdown 相同。

关闭recv只会阻止您的代码读取更多数据。如果您尝试这样做,您将收到套接字错误。同样,如果连接的另一端尝试向您发送数据,它将收到一个错误(抱歉再次切换到 TCP 世界,但我相信 RST 会回复给发送者)。

关闭发送同样会阻止您的代码发送更多数据。如果我没记错的话,这看起来与关闭套接字时发生的情况相同(发送一个零长度数据包以向另一端发送特定 channel 已关闭的信号)。任何 future 的发送尝试都会返回错误。

4)您必须检查您的文档才能确定。 MSDN会给你一个很好的指示,尽管我不知道我会认为它是权威的。

关于boost-asio - 应该如何拆除 boost::asio::ip::udp::socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1222637/

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