RAII插座:何时释放(关闭) 我想在C套接字上写一个简单的、小的C++ RAII包装器。

RAII插座:何时释放(关闭) 我想在C套接字上写一个简单的、小的C++ RAII包装器。,c++,c,linux,sockets,raii,C++,C,Linux,Sockets,Raii,问题是,套接字在什么状态下被视为已初始化(从RAII的角度来看)并符合发布条件 例如,对于TCP客户端套接字:如果socket调用成功,但connect调用失败,是否应调用close 这只是一个例子,我对一个一般性的答案感兴趣,比如: 必须关闭由socket成功创建的每个套接字。 或 每个连接、侦听或接受都必须关闭 socket&friends和close的手册页不是很清楚(至少对我来说是这样)。套接字配对的两个部分是socket()和connect()和shutdown()。如您所见,它不

问题是,套接字在什么状态下被视为已初始化(从RAII的角度来看)并符合发布条件

例如,对于TCP客户端套接字:如果
socket
调用成功,但
connect
调用失败,是否应调用
close

这只是一个例子,我对一个一般性的答案感兴趣,比如:

  • 必须关闭由
    socket
    成功创建的每个套接字。
  • 每个
    连接
    侦听
    接受都必须关闭

socket
&friends和
close
的手册页不是很清楚(至少对我来说是这样)。

套接字配对的两个部分是
socket()
connect()
shutdown()
。如您所见,它不像使用
malloc()
free()
那么简单。由于并非每个套接字都用于
connect()
,有些套接字还使用
bind()
accept()
,这一事实使情况更加复杂。但是,如果您在未调用
shutdown()
的情况下调用
close()
,这只是远程端作为错误经历的强制关机,但您正确地释放了分配的资源


我会考虑包装两次,一次调用<代码>关闭()/代码>,另一次调用<代码>关闭()/<代码>。不过,我不会太担心第二部分,因为

shutdown()失败
基本上还是无害的。

如果你有一个有效的/活动的套接字句柄,那么它就被初始化了。@CaptainObvlious什么时候套接字句柄被认为是vaid/活动的?当
socket
accept
返回一个值而不是
INVALID\u socket
并且直到
关闭句柄。@CaptainObvlious ty,我想这就是答案。
INVALID_SOCKET
是一个WinSock常量,@CaptainObvlious。在Unix传统中,Linux使用的文件描述符只是指向基于零的数组的索引,因此小于零的任何内容都是来自socket()的“错误”返回值。哦,对于64位的WinSock,检查负值失败了,因为如果我没记错的话,套接字句柄类型是一个无符号整数(我必须承认,已经有一段时间了)。@bolov:正如Ulrich所说,您不必太担心调用
shutdown
,因为如果不这样做,将不会泄漏资源。所以我不会费心用RAII包装它。Unix上的规则非常简单:如果任何调用返回的文件描述符>=0(
open
socket
accept
dup
…),则必须
关闭它以避免资源泄漏。