2009-08-03 84 views
10

我已阅读boost asio参考,阅读了教程并查看了一些示例。不过,我无法看到一个插座应该如何拆除:应该怎么拆掉boost :: asio :: ip :: udp :: socket?

  1. 我应该调用close()还是通过套接字的析构函数完成?
  2. 什么时候应该关机()
  3. shutdown()有什么影响? 我知道它“禁用发送或接收”,但这是如何完成的?如果在禁用之后使用套接字发送或接收,我可以期待什么?
  4. 哪些错误可我从接近()预计

回答

10

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

1)这是我的经验使用ASIO套接字,析构函数处理关闭套接字。不过,我只处理了TCP套接字。检查这个的最好方法是简单地查看析构函数的代码,看它是否有类似于close的任何事情。我知道Boost代码可能有点棘手,所以简单地创建一个打开UDP套接字然后破坏它的小示例程序可能是最简单的。这样你就可以在调试器中遍历代码来遵循逻辑。

由于Boost的设计者考虑到了TCP套接字,所以我很难想象它们对于UDP套接字不会这么做。

2)仅当您觉得有必要防止任何代码在插座上执行将来的recv和/或send时,才致电shutdown()。这通常不是必需的,尽管我已经看到它在TCP套接字上用来强制套接字在关闭时发送一个RST(与处理未决发送时的默认“优雅”关闭相反)。

3)您可以将套接字视为双通道通信形式:一个用于读取,另一个用于发送。您可以关闭其中一个,另一个可以在另一个关闭的情况下继续使用一个通道(即关闭后可继续接收,反之亦然)。关闭套接字与在recv和send上调用shutdown完全相同。

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

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

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

+0

谢谢,我也想通了一些这方面,但我仍不能确定是否关闭()真的是所谓的插座的析构函数。我真正没有注意到的是boost asio和传统网络编程之间的紧密联系。你对shutdown()的解释和查看msdn套接字错误代码的建议都表明了这一点。 +1 – Torleif 2009-11-10 20:53:24

1

从Boost网站上给出的例子看来,您应该简单地使用close()。例如,看这一个:

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

从这个地址摘自:HTTP Server

相关问题