RAII套接字:何时发布(关闭)

bol*_*lov 8 c c++ sockets linux raii

我想在C套接字上编写一个简单的小型C++ RAII包装器.

问题在于什么状态是被认为是初始化的套接字(从RAII的角度来看)并且因此有资格发布.

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

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

  • socket必须关闭成功创建的每个套接字.
    要么
  • 每个人都必须关闭connect,listen或者accept.

socket和朋友的手册页close并不是很清楚(或者至少对我来说).

Ulr*_*rdt 3

套接字配对的两个部分是socket()withclose()connect()with shutdown()。如您所见,它并不像malloc()和 那样容易free()。事实上,并非每个套接字都使用 to connect(),有些还使用bind()和,这一事实使情况变得更加复杂accept()。但是,如果您close()在没有 的情况下调用shutdown(),则只是强制关闭,远程端将其视为错误,但您正确地释放了分配的资源。

我会考虑将其包装两次,一次调用close(),另一次调用shutdown()。不过,我不会太担心第二部分,因为失败shutdown()仍然基本上是无害的。