|
ストリームソケット
接続を受け付ける側をサーバといい、接続を要求する側をクライアントと呼びます。
クライアントが接続要求を出す際にサーバは待っていなければなりません。
そのために、接続は以下のような手順で行われます.
サーバ | クライアント |
socket() | socket() |
bind() |
listen() |
accept() | connect() |
read(),write() | read(),write() |
close() | close() |
ここでは上から下方向に時系列順に書かれています。
この表が示すところは、クライアントのconnect()はlisten()より後でなければ
なりません。そうでなければクライアントからの接続は失敗します.
ひとたびコネクションが確立されたらその後は双方いつでも、
データの送受信が可能です。
以下にサーバとクライアントが接続するさいにふむ手順の考え方について、
以下に説明します。
サーバ
サーバプログラムは以下の手順でAPIを呼び出して、通信する必要があります。
ネットワークに接続されたマシンのOSはソケットを管理していますので、
OSはそのマシンの中の電話管理係のようなものです。
サーバプログラムはOSに対して、APIを使ってシステムコールを実行して、
処理を依頼するのです。
以下にサーバプログラムが通信する際にふむ手順を説明します.
理解しやすくするために、実際の人の通信でどのような処理に
対応するのかを説明しています。
エンドポイントの作成
|
int listen_socket = socket(AF_INET,SOCK_STREAM,0)
|
---|
- サーバプログラムはOSに、自分の部屋に電話のソケットを取り付けてくれ
と頼んで、それをやってもらう
アドレスとポート番号の設定
|
bind(int listen_socket, sockaddr addr, int size)
|
---|
- サーバプログラムはOSに、さっきつけてもらったソケットのlisten_socketで
addrで示す電話番号を使わせてくれるように頼む。
当然OSはその番号が他の人に使われていたらできないという。
接続待ち状態にする
|
listen(int listen_socket)
|
---|
- サーバプログラムはOSに、
ソケットのsにつけた番号に連絡があったら、一応接続を受け付けておいて,
保留にしておいて、こちらがいいと言ったらこっちにまわしてくれと頼む
接続を受け付ける
|
int connected_socket = accept(int listen_socket)
|
---|
- こちらは通信できる状態になったので、サーバプログラムはOSに、
保留にしている相手がいたら繋いでくれるように言う.
なければ、相手からの接続があるまで待ち続ける(プログラムは
接続要求があるまでここで止まっている)
通信する
|
read(connected_socket,char* buf,int buflen)
write(connected_socket,char* buf,int buflen)
|
---|
- 相手からの接続要求があったので、この後、read(),write()
あるいはsend(),recv()を使って通信をする
接続を切る
|
close(connected_socket)
|
---|
- 相手との終了が終わったので電話を切る
接続受付を終了する
|
close(listen_socket)
|
---|
- サーバプログラムはOSに、もう相手から接続要求があっても
受け付けないでくれと頼む
クライアント
クライアントプログラムはサーバに比べると非常に単純です.
行う必要のある処理は以下のものだけです。
エンドポイントの作成
|
int s = socket(AF_INET,SOCK_STREAM,0)
|
---|
- クライアントプログラムはOSに、自分の部屋に電話のソケットを取り付けてくれ
るように要求する
接続要求
|
connect(s,sockaddr server,int size);
|
---|
- クライアントプログラムはOSに、
自分の部屋に電話のソケットの電話をサーバに繋いでくれるように
要求する
実際には暗黙のうちにconnect()時にbind()に相当する処理が
OSによってなされています。実際にsocket()の後にbind()を
実行するのが正式な手順かもしれませんが、無くても
動く場合がほとんどです。
ストリームソケット(TCP)を利用したプログラムのサンプルへ
|   |
|