続いて client_acceptor.h について見ていこう。 クライアントとの接続をどう扱うかについては、以前に見てきた通り複雑だろうか?いや違う。
ACE に慣れれば慣れるほど、詳細部分については既に面倒なことが処理されていることに気付くだろう。 特にクライアントの接続を受け付ける部分は素晴しく、他の方法を思い付かないほどだ。 ACE 開発チームは利用者のために C++ テンプレートという方法を選択し、ACE を構築した。 我々がすべきは、ただ接続が来た時に処理するオブジェクトの準備をするだけである。
// $Id$ #ifndef CLIENT_ACCEPTOR_H #define CLIENT_ACCEPTOR_H /* ACE_Acceptor<> テンプレートは ace/Acceptor.h ヘッダに記述されている。 ACE オブジェクトやヘッダには統一された命名規則が利用されている。 つまり ACE_Foobar というオブジェクトであれば ace/Foobar.h に記述されるのである。 */ #include "ace/Acceptor.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ /* クライアントが接続してきたソケットに対して処理をするには SOCK_Acceptor が必要である。 */ #include "ace/SOCK_Acceptor.h" /* これから開発する Client_Handler オブジェクトは、クライアントからの接続があるたびに一度作成される。 ACE_Acceptor オブジェクトテンプレートは最初のパラメータとしてそれ(ハンドラオブジェクトの型)を要求する。 状況によっては型の前方宣言のみで良い場合もあり、定義全てが必要になる場合もある。 */ #include "client_handler.h" /* パラメータ化された ACE_Acceptor<> は(クライアントからの)ソケット接続を待ち、それが発生したら Client_Handler オブジェクトを作成する。 チュートリアル 001 で学んだような基本的なアクセプタのロジックは ACE_Acceptor<> の実体化により生成される。 そのため、ややこしい部分については ACE テンプレートに任せてしまうことができる。 */ typedef ACE_Acceptor <Client_Handler, ACE_SOCK_ACCEPTOR> Client_Acceptor; #endif /* CLIENT_ACCEPTOR_H */