このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/274
#  [1]授業単元: プログラミング 
#  [2] 問題文: 
#  unixのソケット通信を使ったTCP/IPの通信型プログラムで、まず認証の方法として 
#  ユーザー名とパスワードを打ち込みサーバー側が認証され、その後サーバー側からは 
#  クイズを出題する状態になっていて5問正解した場合(正解数はサーバー、クライアント 
#  両方保持した状態)、暗証のメッセージを送信するということになっていて、 
#  その場合のクライアント側のプログラムを作成せよ(書き方がおかしかったら 
#  すいません) 
#  

'unixのソケット通信を使ったTCP/IP通信に於けるサーバー認証のクライアント側動作'(Server,Port,Socket,Input,Output) :-
      サーバーとの通信を確立し(Server,Port,Socket,Input,Output),
      最初にユーザー名とパスワードを打ち込み(Input,Output),
      後にサーバーからの五問の質問に答える(1,Input,Output),
      サーバーからの認証通知を得る(Input),!.

サーバーとの通信を確立し(Socket,Input,Output) :-
      socket(internet, stream, Socket),
      socket_connect(Socket, Host : Port).
      open(Socket, read, Input),
      open(Socket, write, Output),!.

ユーザー名とパスワードを打ち込み(Input,Output) :-
      get_line(Input,'Username: '),
      ユーザ名の取得(_ユーザ名),
      ユーザ名の送信(Output,_ユーザ名),
      get_line(Input,'Password: '),
      パスワードの取得(_パスワード),
      パスワードの送信(Output,_パスワード),!.

後にサーバーからの五問の質問に答える(N,Input,Output) :- N > 5,!.
後にサーバーからの五問の質問に答える(N,Input,Output) :-
      サーバーからの質問を取得(Input,_質問),
      質問文の表示(_質問),
      回答を得る(_回答),
      回答の送信(Output,_回答),
      N2 is N + 1,
      後にサーバーからの五問の質問に答える(N2,Input,Output),!.

ユーザ名の取得(_ユーザ名) :-
      get_char(C),
      ユーザ名文字ならびの取得(C,L),
      atom_chars(_ユーザ名,L),!.

ユーザ名文字ならびの取得('\n',[]) :- !.
ユーザ名文字ならびの取得(A,[A|R]) :-
      get_char(B),
      ユーザ名文字ならびの取得(B,R).

ユーザ名の送信(Output,_ユーザ名) :-
      write(Output,_ユーザ名),!.

パスワードの取得(_ユーザ名) :-
      rawmode,
      get_char(C),
      パスワード文字ならびの取得(C,L),
      atom_chars(パスワード,L),norawmode,!.

パスワード文字ならびの取得('\n',[]) :- !.
パスワード文字ならびの取得(A,[A|R]) :-
      get_char(B),
      put_char('*'),
      パスワード文字ならびの取得(B,R).

パスワードの送信(Output,_パスワード) :-
      write(Output,_パスワード),!.

サーバーからの認証通知を得る(Input) :-
      get_line(Input,X),
      認証完了(X).

認証完了(X) :-
      サーバー接続完了通知文字(X),!.
認証完了(X) :-
      write_formatted('認証を拒否されました:%t\n',[X]).

サーバー接続完了通知文字('OK').

質問文の表示(_質問) :-
      write_formatted('%t',[_質問]),!.

回答を得る(_回答) :-
      get_line(_回答),!.

回答の送信(Output,_回答) :-
      write_formatted(Output,'%t\n',[_回答]),!.