Socket::close() 和 StreamSocket::shutdown() 之间的区别

Difference between Socket::close() and StreamSocket::shutdown()

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

根据POCO's introductory slides on Network Programming

POCO sockets are a very thin layer on top of BSD sockets

-- Slide #7

因此 POCO 套接字采用 BSD 套接字的语义 close()shutdown()

this SO answer (which refers to Beej's guide to network programming所述):

close() 将阻止远程套接字上的 reads/writes shutdown() 使您可以更好地控制要切断的一端。 (这解释了 StreamSocket::shutdownSend() and StreamSocket::shutdownReceive() alongside StreamSocket::shutdown() 的存在)

编辑:请务必查看 Beej 指南关于 close().

实际效果的准确性

shutdown 函数关闭连接的发送端和/或连接的接收端。 close 函数只是关闭套接字,不一定对连接有任何影响。但是,如果连接没有引用(因为你 closed 最后一个),那么操作系统将关闭连接。