Socket :: close()和StreamSocket :: shutdown()

时间:2015-10-12 07:29:09

标签: c++ sockets network-programming poco-libraries

当使用Poco的StreamSocket类并且您想要关闭套接字连接时,从Poco文档和函数实现中都不清楚Socket::close()StreamSocket::shutdown()是否最合适打电话的功能。在这些似乎转发到POSIX函数的平台上,shutdown()的手册页指出发送/接收将停止,但没有说明连接本身。我是否可以安全地假设close()基本上是shutdown()所做的超集,因此close()更合适?如果是这样,是否有一个示例场景,其中shutdown()将是更合适的呼叫?

2 个答案:

答案 0 :(得分:2)

shutdown功能会关闭连接的发送方,连接的接收方或两者。 close函数只是关闭套接字,并不一定会对连接产生任何影响。但是,如果连接没有引用(因为你close是最后一个),那么操作系统将关闭连接。

答案 1 :(得分:0)

根据POCO's introductory slides on Network Programming

  

POCO插座是BSD插座顶部非常薄的层

     

- 幻灯片#7

所以POCO套接字对close()shutdown()使用BSD套接字的语义。

正如this SO answer(提到Beej's guide to network programming)中提到的那样:

close()将阻止远程套接字上的读/写,而shutdown()可让您更好地控制哪一端被切断。 (这解释了StreamSocket::shutdownSend()StreamSocket::shutdownReceive()以及StreamSocket::shutdown()

的存在

编辑:请务必查看David Schwartz's comment关于Beej指南有关close()实际效果的准确性。