2015-04-27 95 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