VCEでは、TCPの各コネクションを、2つの構造(体)を使って操作します。
TCPコンテキスト(tcpcontext_t)は複数のTCPコネクション(conn_t)を管理します。
conn_tが、ひとつのソケットに対応します。
サーバ専用の設定項目(ソケットをバインドするアドレス)や、クライアント独自の設定項目(接続先IPアドレス等)、両方に共通の項目があり、すべてをまとめてTCPコンテキストといいます。
TCP/IPネットワーキングにおいて、サーバ側とクライアント側の実装には異なる点がいくつかあるため、VCEでは、サーバコンテキストとクライアントコンテキストという、2種類のTCPコンテキストが用意されています。
vce_tcpcontext_create 関数の第一引数に1を指定するとサーバに、0を指定するとクライアントになります。
サーバコンテキストは、TCPのサーバを管理します。
1つのサーバコンテキストは1個のbind-listenされたサーバソケットに対応し、複数のコネクションを用いたネットワークサービスを提供します。 サーバコンテキストを使うには以下の段階を踏みます。
- 必要に応じてプロトコル処理ルーチンを定義します。
- vce_tcpcontext_create を呼びだす。第一引数に1を指定します。
- vce_tcpcontext_set_conn_parser 関数を用いて、ネットワークからの入力データをレコード単位に分割するためのパーサと、そのパーサによって呼びだされる、1で定義した処理ルーチン(コールバック関数)を登録します。
- vce_heartbeat を呼びだし続けます。
- 処理が終了したら、 vce_tcpcontext_cleanup を呼びだします。サーバの場合は、通常、終了することなく永久ループで実行を続けます。
クライアントコンテキストは、TCPのクライアントを管理します。クライアントコンテキストを使うには基本的には以下の段階を踏みます。
- 必要に応じてプロトコル処理ルーチンを定義します。
- vce_tcpcontext_create を呼びします。第一引数に0を指定します。
- vce_tcpcontext_set_conn_parser 関数を用いて、ネットワークからの入力データをレコード単位に分割するためのパーサと、そのパーサによって呼びだされる、1で定義した処理ルーチンを登録します。
- vce_tcpcontext_connect関数でサーバに接続します。
- vce_heartbeat を呼びだし続けます。
- 処理が終了したら、 vce_tcpcontext_cleanup を呼びだします。
サーバもクライアントもほとんど同じで、 vce_tcpcontext_create への引数が異なるだけです。