参考資料(http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/index.html)を元にRPCサンプルプログラムを動作させてみた際のメモ。
ソースコードほかの入手
$ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist.x
$ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist_server.c
$ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist_client.c
$ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/Makefile
コンパイル
$ make
rpcgen -C dirlist.x
gcc -g -DDEBUG -c -o dirlist_clnt.o dirlist_clnt.c
gcc -g -DDEBUG -c -o dirlist_client.o dirlist_client.c
gcc -g -DDEBUG -c -o dirlist_xdr.o dirlist_xdr.c
gcc -g -DDEBUG -o dirlist_client dirlist_clnt.o dirlist_client.o dirlist_xdr.o -lnsl
gcc -g -DDEBUG -c -o dirlist_svc.o dirlist_svc.c
gcc -g -DDEBUG -c -o dirlist_server.o dirlist_server.c
gcc -g -DDEBUG -o dirlist_server dirlist_svc.o dirlist_server.o dirlist_xdr.o -lnsl
実験その1 単純動作 ※サーバとクライアントで端末を分けること
<サーバ側>
$ ./dirlist_server
<クライアント側>
$ /usr/sbin/rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
536875011 1 udp 50085
536875011 1 tcp 32775
$ ./dirlist_client localhost /usr
errno: 0 (Success)
.
..
share (後略)
ふーん。
実験その2 サーバを強制停止してみる
<サーバ側>
$ ./dirlist_server
^C (※強制停止)
$
<クライアント側>
$ /usr/sbin/rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
536875011 1 udp 50085
536875011 1 tcp 32775
$ ./dirlist_client localhost /usr
localhost: RPC: Remote system error - Connection refused
サーバが死んだが、portmapの情報は生きているのね
実験その3 サーバを再起動してみる
<サーバ側>
$ ./dirlist_server
<クライアント側>
$ /usr/sbin/rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
536875011 1 udp 42517
536875011 1 tcp 32791
$ ./dirlist_client localhost /usr
errno: 0 (Success)
.
..
share (後略)
あぁ。ポート番号が再登録されているね、、消せないのかな?
実験その4 portmapのポート番号を消してみる
<クライアント側>
$ su -
Password: **********
# rpcinfo -d 536875011 1
# rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
# exit
$ ./dirlist_client localhost /usr
localhost: RPC: Program not registered
$
なるほどね。再登録は?
実験その5 portmapのポート番号を再登録してみる
<クライアント側>
$ su -
Password:
# rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
# cat test
536875011 1 udp 42517
536875011 1 tcp 32791
# cat test | pmap_set
# rpcinfo -p localhost
プログラム バージョン プロトコル ポート
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1010 status
100024 1 tcp 1013 status
536875011 1 udp 42517
536875011 1 tcp 32791
# exit
出来た。でもこれはサーバが動作継続していたことが前提だ。サーバプログラム自身で削除、再登録等の状況にマッチした登録って出来ないのか?→多分rpcgebが作るサーバスケルトンを改造しないとできなさそうだ。また今度。
0 件のコメント:
コメントを投稿