我想在C套接字上编写一个简单的小C++RAII包装器。
问题是套接字在什么状态下被认为是初始化的(从 RAII 的角度来看),因此有资格发布。
例如,对于 TCP 客户端套接字:如果socket
调用成功,但connect
调用失败,是否应该调用close
?
这只是一个例子,我对一个一般的答案感兴趣,比如:
- 必须关闭
socket
成功创建的每个套接字。
或 - 每个
connect
、listen
或accept
都必须有一个收盘价。
socket
和朋友以及close
的手册页不是很清楚(或者至少对我来说)。
用于插座配对的两个部分是socket()
close()
和connect()
shutdown()
。如您所见,它并不像malloc()
和free()
那样容易。由于并非每个套接字都用于connect()
,有些套接字还使用bind()
和accept()
,这使情况更加复杂。但是,如果您在没有shutdown()
的情况下调用close()
,这只是远程端作为错误经历的强制关机,但您正确地释放了已分配的资源。
我会考虑包装它两次,一次是调用close()
,另一次是调用shutdown()
。不过,我不会太担心第二部分,因为未能shutdown()
仍然基本上是无害的。