Comments
Description
Transcript
応用プログラミング
本日のレシピ 1.レポート課題1について 2.サーバとクライアントの接続手順 3.サーバプログラム echoServer.c 4. handleTCPClient.c 5.幾つかのプロトコル例 応用プログラミング ex5 2 本日のレシピ サーバとクライアントの接続手順 1.レポート課題1について 2.サーバとクライアントの接続手順 3.サーバプログラム echoServer.c 4. handleTCPClient.c 5.幾つかのプロトコル例 1.サーバが決めたポート番号で受付ポートを作っ て、接続要求を待つ。 2.クライアントが通信ポートを作り、サーバのIP アドレスとポート番号を指定して接続要求。 3.サーバは接続要求を受け、受付ポートとは別の 通信ポートを開いてクライアントと通信する。 4.通信が終了すると、通信ポートが閉じられる。 3 4 接続手順を描いてみる クライアントPC (10.0.1.9) 8007 (OSが決める) echoClient 10.0.1.1 ABC 5007 本日のレシピ 1.レポート課題1について 2.サーバとクライアントの接続手順 3.サーバプログラム echoServer.c 4. handleTCPClient.c 5.幾つかのプロトコル例 サーバPC (10.0.1.1) 接続要求 5007 “ABC” echoServer 5007 9035 10.0.1.9:8007 (OSが決める) 5 6 bind() ● まずはソースコードで アドレス構造体の情報をソケットに対応付ける int bind ( int sockfd, struct sockaddr *my_addr, socklen_t addrlen ) ● ● ● ● sockfd: 割り当てるソケットの記述子 my_addr: IP、ポート番号等を含むアドレス構造体 addrlen: アドレス構造体のサイズ return: 成功すれば 0、エラーなら -1 if ( bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0 )... 7 8 listen() ● accept() ソケットを「接続要求待ち」の状態にする int listen(int s, int backlog) ● ● ● ● s:ソケット(記述子) backlog: 接続要求を待つキューの最大長 return: 成功すれば 0、エラーなら -1 ソケットの接続要求を(待機して)受け取る int accept(int s, struct sockaddr *addr, socklen_t *addrlen) ● ● ● if (liseten(servSock, MAXPENDING) < 0)... ● s:ソケット(記述子) addr: IP、ポート番号等を含むアドレス構造体 addrlen: アドレス構造体のサイズ(へのポイン タ) return: ソケット記述子となる非負の整数、 エラーなら -1 if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)... 9 10 本日のレシピ 1.レポート課題1について 2.サーバとクライアントの接続手順 3.サーバプログラム echoServer.c 4. handleTCPClient.c 5.幾つかのプロトコル例 ソースコードで 11 12 本日のレシピ エコープロトコル(RFC862) このRFC文書は、ARPA Internet Community の標準仕様を規定する。ARPA Internet に接続する コンピュータで、エコープロトコルを搭載するものはここに記された仕様を採用し、また実装して 1.レポート課題1について 2.サーバとクライアントの接続手順 3.サーバプログラム echoServer.c 4. handleTCPClient.c 5.幾つかのプロトコル例 いることが望まれる。 デバッグ・調整のためのとても便利な道具の一つがエコーサービスである。エコーサービスは、 受け取ったデータを送信元に単純に送り返すだけのものである。 ● TCP上でのエコーサービス TCP上の接続ベースでの用途として、一つめのエコーサービスが定義される。サーバは、TCP の7番ポートにて待ち受けする。接続が確立されデータが受信されると、それを送り返す。こ の動作は、接続してきたユーザーが接続を断つまで継続する。 ● UDP上でのエコーサービス UDP上のデータグラムベースでの用途として、もう一つのエコーサービスが定義される。サー バは、UDPの7番ポートにて待ち受けする。データグラムが受信されると、返信用のダイアグ ラムとしてそのデータを送り返す。 13 14 今日のひとことプロトコル(RFC865) daytimeプロトコル(RFC867) このRFC文書は、ARPA Internet Community の標準仕様を規定する。ARPA Internet に接続するコ ンピュータで、今日のひとことプロトコルを搭載するものは、ここに記された仕様を採用し、また実 (前略) デバッグや調整のためのとても便利な道具の一つがdaytimeサービスである。daytimeサービスは、 受信したデータに関わらず現在の日付と時刻を文字列として単純に送り返す。 装していることが望まれる。 デバッグや調整のためのとても便利な道具の一つが、今日のひとことサービスである。今日のひと ● ことサービスは、受信したデータに関わらず短いメッセージを単純に送り返すだけのものである。 ● の13番ポートにて待ち受けする。接続が確立されると、現在の日付と時刻をASCII文字列として 送り返す(受信データは破棄される)。サービスはメッセージ送信後に接続を断つ。 TCP上での文字生成サービス TCP上の接続ベースでの用途として、一つめの今日のひとことサービスが定義される。サーバ は、TCPの17番ポートにて待ち受けする。接続が確立されると、短いメッセージを送り返す(受 信データは破棄される)。サービスはメッセージ送信後に接続を断つ。 ● UDP上での文字生成サービス(省略) ● ひとことの構文 TCP上でのdaytimeサービス TCP上の接続ベースでの用途として、一つめのdaytimeサービスが定義される。サーバは、TCP ● UDP上でのdaytimeサービス(省略) ● daytimeの構文 daytimeのための決まった構文はない。daytimeは、ASCII 印字可能文字、空白、復帰文字、お よび改行文字に制限されることが望ましい。日付と時刻は、1行にするべきである。 ひとことのための決まった構文はない。ひとことは、ASCII 印字可能文字、空白、復帰文字、お よび改行文字に制限されることが望ましい。ひとことは、1行のみでも複数行でも良いが、512 文字未満とするべきである。 ● よく知られている構文: Weekday, Month Day, Year Time-Zone (例)Tuesday, February 22, 1982 17:37:43-PST ● SMTPで使用されているもう一つのよく知られている構文 dd mmm yy hh:mm:ss zzz (例)22 Feb 1982 17:37:43 -0800 15 16 timeプロトコル(RFC868) 積算プロトコル(Apro)(1) (前略) このプロトコルは、サイトに依存しない機械可読な日時を提供する。timeサービスは、1900年1月1日 0:00 からの経過秒数を発信元に送り返す。 全てのシステムが日時を保持する時計を持つわけではないという事実と、時に生じる人や機械のエラーの 存在が、このプロトコルの一つの動機である。timeサーバの使用によって、ネットワーク上の相互に独立な サイトへの短いポーリングに基づき、システムが保持する時刻を素早く確認・修正することができる。 積算サービスは、ネットワーク上の単一、あるいは複数のホストからの数値を収集し、それ らを積算し、保持・参照するために用いられる。積算サービスは、受信されたASCII文字列 を数値として積算し、既に保持している積算値に加算し、新たな積算値をASCII文字列に変 換したものを返信する。 ここでの積算プロトコルは、TCP上にのみ与えられる。 このプロトコルは、TCP上でもUDP上でも使って良い。 サーバは、ネットワーク上のホストが利用可能で、且つ周知可能な任意番号のポートにて TCP接続を待ち受けする。接続が確立されると、サーバはASCII文字列からなる受信データ を受け取り、それらを数値として積算し、新たな積算値、あるいはエラーメッセージを ASCII文字列として返信する。サーバは接続が断たれるまでこれらの処理を繰り返す。 TCP上で用いられる場合は、次の様に動作する。(S:Server、U:User) S: 37番ポートで待ち受け U: S: U: 37番ポートへ接続 32ビット2進数として時刻を送信 時刻を受信 U: 接続を閉じる S: 接続を閉じる サービスの終了は、接続してきたユーザが接続を切るまで継続しても良いし、あるいは1 回の送受信ごとにサーバから接続を切ってもよい。 サーバは37番ポートで接続を待ち受けする。接続が確立すると、サーバは32ビットの時刻値を返送して接続 を閉じる。もし、サーバが自分のサイトの時刻を得られない場合は、接続を拒否するか何も返送せずに接続 を閉じるべきである。 (後略) 17 積算プロトコル(Apro)(2) ● 積算サービスの構文 積算サービスのデータは、空白文字を含むASCII印字可能文字のみからなる、64バイ ト未満の文字列である。NULL文字(終端記号)を含んではならない。 受信文字列は、1つ以上の空白文字で区切られた1つ以上の部分文字列からなる。各 部分文字列は、ANSI C89言語規格の標準ライブラリ関数 double atof(const char *) に準拠したものでなければならない。 返信文字列は、積算値の小数点以下第6桁までの数字をASCII印字可能文字で10進 数で表したものである。 ● 送受信データの例(S:Server、U:User) U: 0.0 S: 0.000000 U:1 2.3 -4.5 S: -1.200000 U:0x10 1e-5 S:14.800010 19 18