II-8-10. ソケットによるネットワーク通信

ネットワークを超えた通信を可能とするソケットの概念を解説する。さらにソケットを用いたネットワーク通信の具体的な手順を示し、サーバプログラムの簡単な動作やホストバイトオーダとネットワークバイトオーダの違いといった関連する話題についても触れる。

【学習の要点】

* ソケットは、ネットワークを超えてプロセス同士が互いに通信を行うことを可能にする。

* ソケットAPIは扱うネットワークに依存しない。カーネル内で定義されているドメインを指定することで扱うネットワークを指定できる。

* ソケットは、socketシステムコールにより生成され、bindシステムコールによりドメイン内で有効な名前を付与する。

* バイトオーダとは、複数バイトを保存する際に、1バイトずつをどういう順序で保存するかを決定するものである。ネットワークを介して通信する際にはネットワークバイトオーダを使用する。

図II-8-10. TCPサーバとクライアントの接続

【解説】

1) ソケットAPI

* ソケットAPIは、ホスト内のプロセス間通信だけでなく、ネットワークを越えてホスト間で通信を行なえるように設計されたものである。

* ソケットAPIはネットワークのプロトコルに依存しないように設計されている。Linuxでは、UNIXドメイン、INETドメイン、BLUETOOTHドメインなどがソケットAPIを使用する。

* ソケットAPIで「ソケット」とは、通信の端点(エンドポイント)を意味する。ソケットは、socketシステムコール(厳密にはLinuxではシステムコールではない)を用いて作成することができる。

* エンドポイントを識別するために、ソケットにはプロトコルアドレスが割り当てられる。プロトコルアドレスはsockaddr構造体で総称(抽象化)され、その実装はプロトコルに依存する。

* ユーザプロセスは、ソケットAPIの提供する一連の関数を用いてカーネルとデータをやりとりする。カーネルは、下位のネットワークサブシステムを呼び出し、実際の通信を行なう。

2) TCPソケット

TCP通信を実現することは、おそらく最もよくあるソケットAPIの利用例である。TCP通信を行なうための使用する主な関数は以下の通りである。

- socket

システムコールによりソケットを作成する。このときTCPプロトコルでの通信を行なうよう、適切な引数を指定する。

int sock = socket(AF_INET, SOCK_STREAM, 0);

- connect

TCPクライアントがサーバに接続する際に用いる。ソケット、サーバのTCPプロトコルアドレス(IPアドレスとポート)を指定する。

connect(sock, (struct sockaddr *) &srv, sizeof(srv));

- bind

ソケットにプロトコルアドレスを割り当てる。通常クライアントではこれを省略する。サーバでは、自身のローカルアドレスを割り当てる。

bind(sock, (struct sockaddr *) &local, sizeof(local));

- listen

TCPサーバがクライアントのconnect要求を待つ。サーバは接続してきたクライアントをキューに入れて保持する。

listen(sock, 5);

- accept

TCPサーバが接続確率済みキューからクライント接続を取り出す。

accept(sock, (struct sockaddr *) &client, sizeof(client));

3) バイトオーダ

バイトオーダとは、複数バイトを保存する際に、1バイトずつをどういう順序で保存するかを決定するものである。ホストによってバイトオーダは異なる場合があるため、ネットワークを介して通信する際には、一貫してネットワークバイトオーダを使用する。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。

フォーラム会員企業専用

記事配信

コンテンツ配信

ユーザログイン