ストリームソケット(Stream Socket)

コネクション型接続を行うストリームソケットについて説明します

ストリームソケット

接続を受け付ける側をサーバといい、接続を要求する側をクライアントと呼びます。 クライアントが接続要求を出す際にサーバは待っていなければなりません。 そのために、接続は以下のような手順で行われます.

サーバクライアント
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)を利用したプログラムのサンプルへ
 
FC Lab logo Copyright(c) 2001Takeshi FUJIKI All right reserved