課題2:inetdを使用するサーバプログラムの作成


はサーバ(server.c)をinetdから起動することで、サーバはクライアント(client.c)の標準入力から入力された文字に対応するキーワードをクライアントに返すプログラムである。サンプルプログラム(1)を自分の実験環境で動作するようにし、実行結果を示すとともに、プログラムの中で使われている関数(Connect,Disconnect, Send Data, Recv Dataなど)の動作を説明し、サーバ・クライアント動作全体をフローを示して説明せよ。

【サンプルプログラム実行前の準備】


1.サンプルを取り、/etc/inetd.confを編集する。
netd.confがあるか、または、アクセス権があるかをチェックする。
st-NEET:~ j05043$ ls -l inetd.conf
-rw-r--r--   1 root  wheel  2893 Aug 22  2005 inetd.conf
st-NEET:~ j05043$ udo chmod o+w inetd.conf
tcsh: udo: Command not found.
st-NEET:~ j05043$ sudo chmod o+w inetd.conf
Password:
編集する。
open -a mi inetd.conf
でinetd.confを開き
/sbin/service --listのコメントアウトを削除。
最下部に「tcpinetd  stream  tcp  nowait  root  /(絶対パス)/server」を追加。
を行ないセーブして終了。最後にアクセス権を戻す。
st-NEET:~ j05043$ open -a mi inetd.conf
st-NEET:~ j05043$ sudo chmod o-w inetd.conf
Password:
st-NEET:~ j05043$ ls -l inetd.conf
-rw-r--r--   1 root  wheel  2963 Dec 11 21:10 inetd.conf

2.「/etc/services」を編集する
%cd /etc/
%ls -l services 
-rw-r--r--   1 root     wheel      572694 Dec 11 22:01 services

アクセス権がないのでアクセス権を変更する
%sudo chmod o+w services

エディタで編集する
%open -a mi services
最下部に「tcpinetd  5682/tcp」を追加する

3.server.cの修正
#define	DATAFILE	"data"
を自分の設定に直す
(/Users/j05043/jikken/nagata/tcpip/data)

4.cliant.cの修正
#define	HOST_NAME	"hoge"
を自分の設定に直す
(nw0543.st.ie.u-ryukyu.ac.jp)

5.コンパイルする
%cc -g -o server server.c
%cc -g -o ckiant cliant.c


【サンプルプログラムの実行】


%sudo xinetd -inetd_compat

%./client 
Connected.
Input Keyword = warning: this program uses gets(), which is unsafe.
yama
Keyword = [yama] / Data = [kawa]

Input Keyword = 123
Keyword = [123] / Data = [456]



【プログラムの解説】


Connect() ソケットを生成し、コネクション確立の準備を行う事が出来る
SendData() サーバにデータを送ることができる
RecvData() データを受信することができる
Disconnect() コネクションを切断することができる
GetLineFromPeer() クライアントからデータを受け取ることができる
GetKetbordData() 受信したデータを変換することができる
sprint() 変換したデータをクライアントに送信することができる


(1)コネクションを確立する
(2)次のメソッド
(3)データを送信する
(4)受信したデータを次のメソッドに渡す
(5)dataファイルの中身と比較
(6)dataファイルの中身と比較
(7)変換した結果を次のメソッドに渡す
(8)変換した結果を送信
(9)次のメソッド