データグラムソケット(Datagram Socket)

データグラムソケットについて説明します

データグラムソケット

データグラムソケットは、ストリームソケットと異なり、 コネクションを確立する処理が不要なので、 処理の手順は以下のように非常に簡単です。

受信プログラム送信プログラム
socket()socket()
bind()
recvfrom()sendto()
close()close()

ここでは上から下方向に時系列順に書かれています。 受信プログラムがrecvfrom()を実行すると、データが到着するまでブロックし (プログラムは停止して待ち)ます。 送信プログラムがsendto()で送信したデータが到着した時点で 受信プログラムがbind()が終了していなければ、 送ったデータは捨てられます。それ以後であれば、recvfrom()まで OSが保存しておいてくれます。

以下にサーバとクライアントが接続するさいにふむ手順の考え方について、 以下に説明します。

受信プログラム

データグラムソケットの処理は私書箱宛の手紙を届けることに似ているので、 以下ではその例えを用いて概念を説明します。
エンドポイントの作成 int s = socket(AF_INET,SOCK_DGRAM,0)
プログラムはOSに、自分のために私書箱を設けてくれるように頼む

アドレスとポート番号の設定 bind(int s, sockaddr addr, int size)
プログラムはOSに、さっきもど設けた私書箱に addrで示す私書箱番号をつけてくれるようにに頼む。 当然OSはその番号が他の人に使われていたらできないという。
データの受信 recvfrom(int s, char* buf,int buflen,int flag,sockaddr& from, int size)
私書箱にデータが届いていれば渡してもらいます。まだ 一つも届いていなければ、届くまで待ちます。
エンドポイントのクローズ close(int s)
自分につくってもらった私書箱を取り除いてもらいます。 これ以後、データが届いても捨てられます。

送信プログラム

送信プログラムはさらに簡単で、必要なのは以下の手順だけです。
エンドポイントの作成 int s = socket(AF_INET,SOCK_DGRAM,0)
プログラムはOSに、自分専用の送信用ポストを設けてもらいます
データの送信 sendto(int s, char* buf,int buflen,int flag,sockaddr& to, int size)
データを書いた手紙をポストに投函します。

データグラムソケット(UDP)を利用したプログラムのサンプルへ
 
FC Lab logo Copyright(c) 2001Takeshi FUJIKI All right reserved