ソケットは一般にクライアントとサーバーの対話で使用されます。
通常のシステム構成では、一方のマシンにサーバーを、
もう一方のマシンにクライアントを置きます。
クライアントはサーバーに接続して情報を交換し、その後切断します。
ソケットには定型のイベント・フローがあります。
コネクション型クライアント/サーバー・モデルでは、
サーバー・プロセス上のソケットはクライアントからの要求を待ちます。
これを行うため、サーバーはまず、
クライアントがサーバーを探せるようにアドレスを確立 (バインド) します。
アドレスが確立されると、サーバーはクライアントがサービスを要求してくるのを待ちます。
クライアントとサーバーとの間のデータ交換は、
クライアントがソケットを経由してサーバーに接続しているときに行われます。
サーバーは、クライアントの要求を実行し、クライアントに応答を送信し返します。
注: 現在、IBM は、大部分のソケット API について、2 つのバージョンをサポートしています。
デフォルトの IBM® i ソケットはバークレー・ソケット・ディストリビューション (BSD) 4.3 の構造と構文を使用します。
もう一方のバージョンのソケットは、BSD 4.4 および UNIX 98 プログラミング・インターフェース仕様と互換性のある構文および構造を使用します。
プログラマーは、_XOPEN_SOURCE マクロを指定することにより、UNIX 98 と互換性のあるインターフェースを使用することができます。
以下の図は、コネクション型ソケット・セッションの典型的なイベント・フロー (および API が発行される順序) を表しています。
各イベントの説明が、図の後に続きます。
これが、コネクション型ソケットの一般的なイベント・フローです。
- socket() API は、通信用の端点を作成し、端点を表すソケット記述子を戻します。
- アプリケーションがソケット記述子をもつと、アプリケーションはソケットに固有な名前をバインドできます。
サーバーは、ネットワークからのアクセスを可能にするために、名前をバインドする必要があります。
- listen() API は、クライアントの接続要求を受け入れる態勢を示しています。
listen() API がソケットに対して発行されると、そのソケットは接続要求を積極的には開始しません。
listen() API は、ソケットが socket() API で
割り当てられ、bind() API がそのソケットに名前をバインドした後に発行されます。
listen() API は accept() API の発行前に発行されていなければなりません。
- ストリーム・ソケットの connect() API は、クライアント・アプリケーションがサーバーへの接続を確立するのに使用されます。
- サーバー・アプリケーションは accept() API を使用して、クライアント接続要求を受け入れます。
サーバーは、accept() API を発行する前に、 bind() API と listen() API を正常に発行している必要があります。
- ストリーム・ソケット間 (クライアントとサーバーの間) に接続が確立されると、ソケット API データ転送 API をどれでも使用できるようになります。
クライアントとサーバーには、選択可能な多くのデータ転送 API があります。
例えば、send()、recv()、read()、write() などです。
- サーバーまたはクライアントが操作を停止するときは、
ソケットが獲得したシステム・リソースを解放するために close() API を発行します。
注: ソケット API は、通信モデルの中でアプリケーション層とトランスポート層の間に位置します。ソケット API は、
通信モデルの中の層ではありません。ソケット API を使用することにより、
アプリケーションは一般的な通信モデルのトランスポート層やネットワーク層と対話できます。
以下の図の矢印は、ソケットの位置とソケットが提供する通信層とを示しています。
一般に、ネットワーク構成では、
セキュア内部ネットワークと非セキュア外部ネットワークとを接続することはできません。
しかし、ソケットがファイアウォール (高度なセキュア・ホスト) の外部にあるシステムのサーバー・プログラムと通信できるようにすることもできます。
ソケットはマルチプロトコル・トランスポート・ネットワーキング (MPTN) 体系を支える、IBM の AnyNet® 実装の一部でもあります。MPTN 体系は、
追加のトランスポート・ネットワークの中から 1 つのトランスポート・ネットワークを操作できるようにしたり、
異なるタイプのトランスポート・ネットワーク間でもアプリケーション・プログラムを接続したりできるようにします。