2015-04-27 40 views
8

我想通过C套接字编写一个简单的小型C++ RAII封装。RAII套接字:何时发布(关闭)

问题是什么状态是一个套接字被考虑初始化(从RAII的角度来看),因此符合发布条件。

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

这只是一个例子,我感兴趣的是一个笼统的回答,是这样的:

  • 通过socket成功创建每个插座都必须关闭。
  • 必须关闭每个connect,listenaccept

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

+0

如果您有一个有效的/活动的套接字句柄,那么它已被初始化。 –

+0

@CaptainObvlious何时套接字句柄被视为vaid/active? – bolov

+0

套接字句柄在'socket'或'accept'返回一个非INVALID_SOCKET的值并且关闭句柄之前是有效的。 –

回答

3

配对插座的两个部分是socket()close()connect()shutdown()。如您所见,它不像malloc()free()那样容易。这并不是每个插座都用于connect(),有些也使用bind()accept()来代替。但是,如果您在没有shutdown()的情况下致电close(),这只是强制关闭,而远程端会遇到此错误,但您可以正确释放分配的资源。

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

+0

为'bind'和'accept'应该关闭被调用? – bolov

+0

@bolov:正如Ulrich所说,你不必担心调用'shutdown'因为不这样做不会泄漏资源。所以我不会用RAII来包装它。 Unix上的规则非常简单:如果任何调用返回文件描述符> = 0('open','socket','accept','dup' ...),则必须“关闭”它以避免资源泄漏。 – Nemo