小目次

目次にもどる
ー前準備
ーサンプルプログラムの実行
ープログラムの説明

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


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


前準備

1、サンプルプログラムのダウンロード
サンプルプログラムをダウンロードして実験用のフォルダに入れる
今回は「/Users/j05017/jikken2/tcpip」を使用する

2、「/etc/inetd.conf」を編集する
とりあえず/etc/まで移動してinetd.confがあるのを確かめる
%cd /etc/
%ls -l inetd.conf
-rw-r--r--   1 root     wheel        2963 Nov 27 17:08 inetd.conf

アクセス権がなくて編集できないのでアクセス権を変更する
%sudo chmod o+w inetd.conf

エディタで編集する(今回はmiを使用)
%open -a mi inetd.conf
上の方にある「/sbin/service --list」のコメントアウトをはずす(「#」を削除する)
最下部に「tcpinetd  stream  tcp  nowait  root  /(絶対パス)/server」を追加(絶対パスは%pwdで調べる)
今回は/Users/j05017/jikken2/tcpip内にサンプルプログラムが入っているので
「tcpinetd  stream  tcp  nowait  root  /Users/j05017/jikken2/tcpip/server」
セーブして終了

アクセス権をもとに戻して、戻ってることを確認する
%sudo chmod o-w inetd.conf
%ls -l inetd.conf
-rw-r--r--   1 root     wheel        2963 Nov 27 17:15 inetd.conf

もとに戻ってるのでOK

3、「/etc/services」を編集する
とりあえず/etc/まで移動してinetd.confがあるのを確かめる
%cd /etc/
%ls -l services 
-rw-r--r--   1 root     wheel      572694 Nov 27 15:22 services

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

エディタで編集する(今回はmiを使用)
%open -a mi services
最下部に「tcpinetd  5682/tcp」を追加
セーブして終了

アクセス権をもとに戻して、戻ってることを確認する
%sudo chmod o-w services
%ls -l services 
-rw-r--r--   1 root     wheel      572694 Nov 27 15:25 services

もとに戻ってるのでOK

4、server.cの修正
#define	DATAFILE	"data"
を自分の設定に直す
(今回は#define	DATAFILE	"/Users/j05017/jikken2/tcpip/data")

5、cliant.cの修正
#define	HOST_NAME	"hoge"
を自分の設定に直す
(今回は#define	HOST_NAME	"nw0517.st.ie.u-ryukyu.ac.jp")
6、コンパイルする
%cc -g -o server server.c
%cc -g -o client client.c
上にもどる
目次にもどる

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

1、「%sudo xinetd -inetd_compat」としてxinetdを動かす (sudo するのはroot権限で実行するため)
2、「%./cliant」で実行(returnもしくはenterキーで終了)
%./client 
Connected.
Input Keyword = warning: this program uses gets(), which is unsafe.
yama
Keyword = [yama] / Data = [kawa]

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

Input Keyword = 
Disocnnected.
「このプログラムには安全でないgets関数がつかわれています」というメッセージが出るが、見なかったことにする

ちなみに、終了後にxinetdを殺す方法
%ps -aux | grep xinetd
root       750   0.0  0.0    27376    332  ??  Ss    4:43PM   0:00.01 xinetd -inetd_compat
j05017     764   0.0  0.0     8780      8  p1  R+    4:51PM   0:00.00 grep xinetd
%sudo kill 750
上にもどる
目次にもどる

プログラムの説明

関数については関数メモを参照
client.cのソースコード(別ウィンドウ)
Connect()ソケットを生成し、コネクション確立の準備をする
SendData()サーバにデータを送る
RecvData()データを受信する
Disconnect()コネクションを切断する
server.cのソースコード(別ウィンドウ)
GetLineFromPeer()クライアントからデータを受け取る
GetKetbordData()受信したデータを変換
sprint()変換したデータをクライアントに送信、main()内にある

client.cとserver.cの動作を示す図

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