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

时间:2015-04-27 17:38:43

标签: c++ c linux sockets raii

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

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

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

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

  • 必须关闭close成功创建的每个套接字 或
  • 每个socketconnectlisten必须关闭。

accept&的手册页朋友和socket不是很清楚(或者至少对我来说)。

1 个答案:

答案 0 :(得分:3)

配对套接字的两个部分是socket() close()connect() shutdown()。如您所见,它并不像malloc()free()那么简单。事实上,并非每个套接字都用于connect(),而有些套接字也使用bind()accept(),这使事情变得更加复杂。但是,如果您在没有close()的情况下调用shutdown(),则只是远程端出现错误的强制关闭,但您正确释放已分配的资源。

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