怎么应该拆掉boost :: asio :: ip :: udp :: socket?

时间:2009-08-03 14:23:13

标签: boost-asio

我已阅读了boost asio参考资料,完成了教程并查看了一些示例。不过,我无法看到套接字应如何拆除:

  1. 我应该调用close()还是由socket的析构函数完成?
  2. 我何时应该致电shutdown()
  3. shutdown()有什么影响? 我知道它“禁用发送或接收”,但这是如何完成的?如果我在禁用后使用套接字发送或接收,我能得到什么?
  4. 我可以从close()
  5. 中得到哪些错误

2 个答案:

答案 0 :(得分:10)

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

1)这是我使用ASIO套接字的经验,析构函数处理关闭套接字。但是,我只处理过TCP套接字。检查这个的最好方法是简单地查看析构函数的代码,看看它是否做了类似于close的任何事情。我知道Boost代码可能有点难以理解,因此最简单的方法是创建一个打开UDP套接字然后销毁它的小示例程序。这样,您可以逐步调试调试器中的代码以遵循逻辑。

由于Boost的设计人员将此考虑用于TCP套接字,我很难想象他们不会对UDP套接字做同样的事情。

2)仅当您认为有必要阻止任何代码在套接字上执行未来shutdown()和/或recv时,才调用send。它通常不是必需的,虽然我已经看到它在TCP套接字上用来强制套接字在它关闭时发送RST(而不是默认的“正常”关闭,其中处理待处理的发送)。 p>

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

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

关闭发送同样会阻止您的代码发送更多数据。如果内存正确地为我服务,这看起来与关闭套接字时发生的情况相同(发送零长度数据包以通知另一方特定信道已关闭)。将来发送的任何尝试都将返回错误。

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

答案 1 :(得分:1)

从Boost网站上给出的例子来看,似乎你应该只使用close()。例如,看看这个:

void connection::stop()
{
  socket_.close();
}

取自此地址:HTTP Server