[C言語] RPCサンプルプログラム - 調査

参考資料(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が作るサーバスケルトンを改造しないとできなさそうだ。また今度。

コメント