TCP/IPのサーバ側プログラムの課題

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-05-15
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

■練習問題

★練習問題51 pipe() と TCP/IPのストリーム(1)

pipe() の代りに、TCP/IP のストリームを使って、異なるホスト上のプロセス を接続して、フィルタの処理を行わせてみなさい。

ヒント:例題 を tcp_connect() やtcp_acc_port() を使って書き直すとよい。 プログラムを1つだけ作るのではなく、tcp_connect() をするものと tcp_acc_port() をするものの2つを作るとよい。tcp_acc_port() をする側で は、fork() をして、複数のクライアントに対応するのではなく、むしろ、通 信要求受付用の socket() を close() して、1つの通信先に専念しなさい。

この課題では、fork() は、しなくてもよい。パイプは、fork() でできた親子 関係のあるプロセス間で通信を行うものであるが、TCP/IPでは、親子関係がな いプロセス間で通信ができる。

TCP/IP なら本来双方向で使える。しかし、この練習問題だと単方向だけを使 う。こうすると、パイプと同じような使い方ができる。

★練習問題52 pipe() と TCP/IPのストリーム(2)

練習問題51 で、3つ以上のプロセスを接続できるようにしなさい。

ヒント: ★練習問題40 3個のプロセスをパイプで結ぶに相当する。

プログラムを1つだけ作るのではなく、先頭用、中間用、末尾用の3つを作る とよい。中間用のものは、うまく作ると、何個でもはさみ込めるようになる。

★練習問題53 pipe() と TCP/IPのストリーム(3)

練習問題51 または 練習問題52 で、外部のプログラムを実行できるようにしなさい。

ヒント:dup(), dup2(), close() などで、標準入出力を切り替えて、 execve() などで、プログラムを実行する。

たとえば、シェルに次のように打ち込むことを考える。

% command1 | command2 | command3
この時、シェルは、fork() しながら2つのパイプで3つのプロセスを結び、 execve() など command1, command2, command3 を実行する。この問題では、 パイプではなくTCP/IP 結ぶ。そして、close(), dup(), close() して、 execve() でcommand1, command2, command3 を実行する。

この課題では、tcp_accept() 側で fork() を行う必要はない。1回のコマン ドを実行したら終了するようにする。

★練習問題54 IPアドレスをホスト名に逆変換する

上の tcp_peeraddr_print() は、IP アドレスを数字で表示していた。 これを、ホスト名で表示するようにしなさい。 それには、gethostbyaddr()を利用するとよい。

普通は、ホスト名からIPアドレスを調べる手続き gethostbyname() が使われ る。gethostbyaddr() は、その逆を行う手続きである。

★練習問題55 localhost

telnet で接続先として localhost (127.0.0.1) を指定するとどうなるか。 localhost は、どのホストからも自分自信を指す名前である。

★練習問題56 fingerサーバ

finger サーバを作成しなさい。これは、受け取った文字列を引数にして、 finger コマンドを実行するとよい。そして、実行結果を、接続先に返すよう にするとよい。

finger コマンドのプロセスと finger サーバの間は、パイプで接続しなさい。 今までの例題で利用した方法を組み合わせることで実現することができるはず である(pipe(),fork(),dup(),close(),execve()など)。popen() ライブラリ 関数を利用してもよい。

finger コマンドのプロセスと finger サーバ間をパイプで結ぶ代わりに、 finger コマンドを exec する前に、配管工事をして、標準出力(2)をTCP/IPの ストリームに接続する方法もある。

★練習問題57 httpサーバ

http サーバを作成しなさい。これは、受け取ったファイル名のファイルを開 いて、内容を読み込み、それを接続先に返すようにするとよい。

この課題では、特にセキュリティに気をつけなさい。必ず次の条件を満たすよ うなサーバを作りなさい。

★練習問題58 HTTP Proxy

HTTP proxy 作りなさい。次の機能を、1つ以上付けなさい。


↑[もどる] ←[5月08日] ・[5月15日] [課題]
Last updated: 2000/05/14 19:24:36
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>