RAII插座:何时释放(关闭) 我想在C套接字上写一个简单的、小的C++ RAII包装器。
问题是,套接字在什么状态下被视为已初始化(从RAII的角度来看)并符合发布条件 例如,对于TCP客户端套接字:如果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()。如您所见,它不
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
…),则必须关闭它以避免资源泄漏。