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

我已经阅读了boost asio参考资料,通过了本教程,并看了一些例子.不过,我无法看到插座应该如何拆除:

>我应该调用close()或者这是由socket的析构函数完成的吗?
>什么时候应该关闭shutdown()
> shutdown()有什么影响?
我知道它是“禁止发送或接收”,但是怎么做呢?如果我在禁用后发送或接收套接字,该怎么办?
>我可以从close()中预期哪些错误

解决方法

由于这是一个多问题,我会尽力回答每个部分,以满足您的需求:

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

由于Boost的设计人员考虑到TCP套接字,所以我很难想象他们对UDP套接字不会这样做.

2)只有当您觉得有必要防止任何代码执行未来的recv和/或在套接字上发送时,才调用shutdown().这通常不是必需的,虽然我已经看到它在TCP套接字上使用,以强制套接字在关闭时发送RST(而不是认的“正常”关闭,处理待处理发送).

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

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

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...