ソケットの仕組み
ソケットは一般にクライアントとサーバーの対話で使用されます。 通常のシステム構成では、一方のマシンにサーバーを、 もう一方のマシンにクライアントを置きます。 クライアントはサーバーに接続して情報を交換し、その後切断します。
ソケットには定型のイベント・フローがあります。 コネクション型クライアント/サーバー・モデルでは、 サーバー・プロセス上のソケットはクライアントからの要求を待ちます。 これを行うため、サーバーはまず、 クライアントがサーバーを探せるようにアドレスを確立 (バインド) します。 アドレスが確立されると、サーバーはクライアントがサービスを要求してくるのを待ちます。 クライアントとサーバーとの間のデータ交換は、 クライアントがソケットを経由してサーバーに接続しているときに行われます。 サーバーは、クライアントの要求を実行し、クライアントに応答を送信し返します。
以下の図は、コネクション型ソケット・セッションの典型的なイベント・フロー (および API が発行される順序) を表しています。 各イベントの説明が、図の後に続きます。
![2 つの端点が接続を確立し、クライアントとサーバーを結び付けます。](rxab6500.gif)
これが、コネクション型ソケットの一般的なイベント・フローです。
- 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 を発行します。
![通信層におけるソケットの位置](rxab6501.gif)
一般に、ネットワーク構成では、 セキュア内部ネットワークと非セキュア外部ネットワークとを接続することはできません。 しかし、ソケットがファイアウォール (高度なセキュア・ホスト) の外部にあるシステムのサーバー・プログラムと通信できるようにすることもできます。
ソケットはマルチプロトコル・トランスポート・ネットワーキング (MPTN) 体系を支える、IBM の AnyNet® 実装の一部でもあります。MPTN 体系は、 追加のトランスポート・ネットワークの中から 1 つのトランスポート・ネットワークを操作できるようにしたり、 異なるタイプのトランスポート・ネットワーク間でもアプリケーション・プログラムを接続したりできるようにします。