このディレクトリの索引

% 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). (! _目標) :- (keizo97:6013 :: _目標). _ホスト:_ポート :: _目標 :- クライアント(_ホスト,_ポート,findall(_目標,_目標,_目標ならび)), 全解を取り出す(_目標,_目標ならび). クライアント(_ホスト,_ポート, _項) :- 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out), ホストから情報受信(In,_行2), 受信情報の評価(_項,_行2,_項2,In,Out). 受信情報の評価(_項,_行2,_項2,In,Out) :- catch(read_term_from_atom(_行2,_項2,[]),E,(ストリームを閉じる(In,Out),fail)), ストリームを閉じる(In,Out), 送信項と受信項の単一化(_項,_項2). ホストから情報受信(In,_行2) :- '% end_of_file行までの表示'(In), 行入力(In,_行2). '% end_of_file行までの表示'(In) :- 行入力(In,_行), '% end_of_file行までの表示'(In,_行). '% end_of_file行までの表示'(In,'% end_of_file') :- !. '% end_of_file行までの表示'(In,_行) :- '% end_of_file行が来るまで表示して行く'(In,_行). '% end_of_file行が来るまで表示して行く'(In,_行) :- format('~w\n',[_行]), 行入力(in,_行2), '% end_of_file行までの表示'(In,_行2). 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out) :- サーバと接続する(_ホスト, _ポート,_ソケット), tcp_open_socket(_ソケット, In, Out), 情報を送信する(Out,_項). サーバと接続する(_ホスト, _ポート,_ソケット) :- tcp_socket(_ソケット), tcp_connect(_ソケット, _ホスト:_ポート). 全解を取り出す(P,L) :- member(P,L). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- writef('%w\n',[_エラー情報]), format(Out,'~%w\n',[_エラー情報]). 情報を送信する(Out,_項) :- format(Out,'%w\n',[_項]), flush_output(Out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_接続用ソケット,_ポート), 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd), tcpインタプリタ(AcceptFd). tcpソケットの準備(_接続用ソケット,_ポート) :- tcp_socket(_接続用ソケット), tcp_bind(_接続用ソケット, _ポート), tcp_listen(_接続用ソケット, 5). 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd) :- top_open_socket(_接続用ソケット,AcceptFd,_). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_実行用ソケット,In,Out,_項). 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _実行用ソケット, _Peer), tcp_open_socket(_実行用ソケット, In, Out). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 子タスクで実行(_実行用ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 子タスクで実行(_実行用ソケット,In,Out,_項) :- tell(Out), thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- 目標評価(In, Out, _項), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 目標評価(In, Out, _項) :- catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報),!. 目標評価(In, Out, _項) :- _項=false. 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- write(Out,'% end_of_file\n'), 項書き出す(Out,_項). 項を書き出す(Out,_項) :- format(Out,'~w\n',[_項]), flush_output(out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_接続用ソケット,_ポート), 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd), tcpインタプリタ(_接続用ソケット,AcceptFd). tcpソケットの準備(_接続用ソケット,_ポート) :- tcp_socket(_接続用ソケット), tcp_bind(_接続用ソケット, _ポート), tcp_listen(_接続用ソケット, 5). 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd) :- top_open_socket(_接続用ソケット,AcceptFd,_). tcpインタプリタ(_接続用ソケット,AcceptFd) :- repeat, 行を読みだして実行(_接続用ソケット,AcceptFd), fail. 行を読みだして実行(_接続用ソケット,AcceptFd) :- 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_接続用ソケット,_実行用ソケット,In,Out,_項). 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _実行用ソケット, _Peer), tcp_open_socket(_実行用ソケット, In, Out). インタプリタの実行(_接続用ソケット,_実行用ソケット,In,Out,_項) :- 親タスクで実行(_接続用ソケット,_実行用ソケット,In,Out,_項), 子タスクで実行(_実行用ソケット,In,Out,_項). 親タスクで実行(_接続用ソケット,_実行用ソケット,In,Out,halt) :- close(In), close(Out), tcp_close_socket(_実行用ソケット), tcp_close_socket(_接続用ソケット),!. 親タスクで実行(_,_,In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 子タスクで実行(In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- format(Out,'~w\n',[_文字列]), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_接続用ソケット,_ポート), 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd), tcpインタプリタ(AcceptFd). tcpソケットの準備(_接続用ソケット,_ポート) :- tcp_socket(_接続用ソケット), tcp_bind(_接続用ソケット, _ポート), tcp_listen(_接続用ソケット, 5). 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd) :- top_open_socket(_接続用ソケット,AcceptFd,_). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_実行用ソケット,In,Out,_項). 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _実行用ソケット, _Peer), tcp_open_socket(_実行用ソケット, In, Out). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 子タスクで実行(_実行用ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_接続用ソケット,_ポート), 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd), tcpインタプリタ(_接続用ソケット,AcceptFd). tcpソケットの準備(_接続用ソケット,_ポート) :- tcp_socket(_接続用ソケット), tcp_bind(_接続用ソケット, _ポート), tcp_listen(_接続用ソケット, 5). 接続要求を確認したら接続用ソケットを開く(_接続用ソケット,AcceptFd) :- top_open_socket(_接続用ソケット,AcceptFd,_). tcpインタプリタ(_接続用ソケット,AcceptFd) :- repeat, 行を読みだして実行(_接続用ソケット,AcceptFd), fail. 行を読みだして実行(_接続用ソケット,AcceptFd) :- 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_接続用ソケット,_実行用ソケット,In,Out,_項). 接続されたら実行用ソケットを開く(AcceptFd,_実行用ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _実行用ソケット, _Peer), tcp_open_socket(_実行用ソケット, In, Out). インタプリタの実行(_接続用ソケット,_実行用ソケット,In,Out,_項) :- 親タスクで実行(_接続用ソケット,_実行用ソケット,In,Out,_項), 子タスクで実行(_実行用ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- fork(Pid), ( Pid == child -> 項を実行して結果を返す(In, Out, _項), ストリームを閉じる(In,Out), halt; tcp_close_socket(Socket) ). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/790 # # 1] 授業単元:ネットワーク # [2] 問題文: # マジックパケットを送信するソフトを作成せよ # マジックパケットを送信する(_ブロードキャストアドレス,_Macアドレスの文字コードならび) :- マジックパケットの送出開始(_ブロードキャストアドレス,Socket,Instream,Outstream), '0xffを6回送出する'(Outstream), 'MACアドレスを16回送出する'(Outstream,_Macアドレスの文字コード), マジックパケットの送出終了(Socket,Instream,Outstream). マジックパケットの送出開始(_ブロードキャストアドレス,Socket,Instream,Outstream) :- socket(unix,stream,Socket), socket_connect(Socket,_ブロードキャストアドレス : 7), open(Socket,read,Instream), open(Socket,write,Outsteam). '0xffを6回送出する'(Outstream) :- put_codes(Outsteam,[255,255,255,255,255,255]). 'MACアドレスを16回送出する'(Outstream,_Macアドレスの文字コード) :- for(1,N,16), put_codes(Outsteam,_Macアドレスの文字コードならび), N = 16. マジックパケットの送出終了(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). put_codes(_,[]) :- !. put_codes(Outstream,[Code|R]) :- put_code(Outstream,Code), put_codes(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/955 # # 【 課題 】ネットワークを使用したプログラムを作成 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】 制限なし # 【 期限 】2月12日 # 【 Ver  】java version "1.5.0_26" # 【 補足 】サーバーを作り、そこにtelnetで接続してというプログラムです。例として、英単語に対応する日本語もったサーバを作り、クライアントから送られてきた単語に対応する日本語を送り出すものです。 # ほかに、チャットサーバーをつくり、接続済みのクライアント全てにデータを流すというものなどです。 # 母さんが倒れて課題をやる暇がなくて卑怯だとおもう...でも間に合いそうにない;どうか、手を貸していただきたい。 # もしできあがられましたら、deal_of_deal.yahoo.co.jpのほうへプログラムを書いて送ってくださいorz # # 英和辞典(eat,動詞,[食べる]). 英和辞典(room,名詞,[部屋,余地]). 英和辞典サーバ(_ポート番号) :- 'TCP/IPサーバ開設'(_ポート番号,Socket,Socket2,Input,Output), repeat, command_prompt, socket_raw_receive(NewSocket,4096,_,L,Length), append(L0,[13,10|_],L), atom_codes(_英単語,L0), 英単語に対応する日本語を返す(Output,_英単語), _英単語 = exit, 'TCP/IPサーバ閉鎖'(Socket,Socket2,Input,Output),!. command_prompt(Output) :- write(Output,'英単語をいれてください : '), flush_output(Output),!. 英単語に対応する日本語を返す(Output,exit) :- !. 英単語に対応する日本語を返す(Output,_英単語) :- 英和辞典(_英単語,_,_日本語ならび), append(_,[_日本語|R],_日本語ならび), write_formatted(Output,'%t\n',[_日本語]), flush_output(Output), R = [],!. 'TCP/IPサーバ開設'(Port,Socket,Socket2,Input,Output) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket,1000000), socket_accept(Socket,Host : Port2,NewSocket), open(NewSocket,read,Input), open(NewSocket,write,Output). 'TCP/IPサーバ閉鎖'(Socket,Socket2,Input,Output) :- close(Output), close(Input), socket_shutdown(NewSocket), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/10 # # [1] 授業単元:情報通信 # [2] 問題文(含コード&リンク): # サーバープログラム(英文清書サーバーの作成) # クライアントから送信された(大文字小文字が乱雑な)英文字文字列を次のように変換して送り返す。 #  分の先頭の文字:大文字 #  分の先頭以外の文字:小文字 #  アルファベット以外:変換しない # 改行、スペース、タブにより単語の区切りとする。また、文末は改行コードではなく、ピリオド"."で判定する。 # ポート番号は1202番 # クライアントから接続されると、[Beautify Server Ready]を送信する。 # "\end"または"\END"を送信すると、[Beautify Server Closed]を送信してコネクションを切断する。 # # このサーバーの目的(英文の清書)の範囲内で、高機能にすること(例えば単独の"I"を大文字にする、連続した空白文字を1つのスペースにする、など)を歓迎する。 # 舫い(1202). 'サーバープログラム(英文清書サーバーの作成)' :- 舫い(_舫い), 接続待ち(_差込み,_舫い), 接続(_差込み,Host,Port2,_新しい差込み,_入力,_出力), get_chars(_入力,_文字s), 文字変換(_文字s,_文字s2), put_list(_出力,_文字s2), 終了(_差込み,_新しい差込み,_入力,_出力),!. 接続待ち(_差込み,_舫い) :- socket(internet, stream, _差込み), socket_bind(_差込み,_舫い), socket_listen(_差込み),!. 接続(_差込み,_クライアント,_新しい舫い,_新しい差込み,_入力,_出力) :- socket_accept(_差込み,_クライアント:_新しい舫い,_新しい差込み), open(_新しい差込み,read,_入力), open(_新しい差込み,write,_出力),!. 文字変換(_文字ならび,_文字ならびの二) :- append(L0,[_文字|R],_文字ならび), 大文字または小文字(_文字), to_upper(_文字,_大文字), 文字変換_2(R,R2), append(L0,[_文字2|R2],_文字ならびの二),!. 文字変換_2(['.'|_],['.']) :- !. 文字変換_2([_文字|R1],[_小文字|R2]) :- to_lower(_文字,_小文字), 文字変換_2(R1,R2). 大文字または小文字(_文字) :- _文字 @>= 'a',char @=< 'z',!. 大文字または小文字(_文字) :- _文字 @>= 'A',char @=< 'Z',!. 終了(_差込み,_新しい差込み,_入力,_出力) :- 掃きだし(_出力), close(_入力), close(_出力), socket_shutdown(_差込み), socket_shutdown(_新しい差込み). 掃きだし(_出力) :- flush_out(_出力). 差込み(A,B,C) :- socket(A,B,C). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1147830986/9 # # 1.1行ずつURLが記述されたテキストファイルを読み込み、 # 2.そのURLのコンテンツを取得して # 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) # するプログラムを作ってください。 # # 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 # (リンク先が存在し、そこには必ず<title></title>で囲まれた箇所があるhtml) # また正常系のみで、エラー(テキストファイルが読み込めない、ネットワークが # 繋がらなくてコンテンツが取得できない)の場合の処理は無くて構わない。 # # 1〜3まで順を追ってやっていくと良いよ。 # 1がファイルの扱い、ループ処理や配列の扱い(逐次処理でやれば配列使わないけど)、 # 2がネット(HTTP)関連、3が文字列処理や正規表現あたり。 # '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), member(URL,Lines), 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File), www_lines(Host,Port,File,_行ならび), 文字コードを得る(_行ならび,_文字コード), タイトルを得る(_行ならび,_文字コード,_タイトル), write_formatted('URL=%t タイトル=%t\n',[URL,_タイトル]), fail. '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_). 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,':',Port,'/'|File]),!. 'URLをHost,Port,Fileに分解する'(URL,Host,80,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,'/'|File]),!. 文字コードを得る(_行ならび,_文字コード) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,8,_,P,'char_set',_残り文字列,_,_,_), split(_残り文字列,['=',' ',',','>'],[A|_]), to_upper(A,B), 文字コード(A,_文字コード). タイトルを得る(_行ならび,euc,_タイトル) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,7,_,_,'',_残り文字列,_,_,_), sub_atom(_残り文字列,_,8,_,_エンコードされたタイトル,'',_,_,_,_), URLの文字列をデコードする(_エンコードされたタイトル,_タイトル),!. 文字コード('EUC_JP',euc) :- !. 文字コード('EUC-JP',euc) :- !. 文字コード('SJIS_JP',sjis) :- !. 文字コード('SJIS-JP',sjis) :- !. www_lines(Host, Port, File, DataList) :- hp_open_client(Host, Port, Socket), make_request_header(Host,Header), hp_work_client(Socket,Header,DataList). hp_open_client(Host, Service, Socket) :- atom(Service), !, net_service(Service, tcp, Port), socket(internet, stream, Socket), host_addr(Host, Addr), socket_connect(Socket, Addr : Port). hp_open_client(Host, Port, Socket) :- integer(Port), !, socket(internet, stream, Socket), socket_connect(Socket, Host : Port). make_request_header(_ファイル,Header) :- myhostname(Myhostname), request_header_file(_ファイル,_整形されたファイル), concat_atom(['GET ',_ファイル,' HTTP/1.1\nHost: ',Myhostname, '\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.8) Gecko/20050511\n', 'Accept: text/xml,application/xml,application/xhtml+xml,', 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: ja,', 'en-us;q=0.7,en;q=0.3\nAccept-Encoding: gzip,deflate\n', 'Accept-Charset: EUC-JP,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\n', 'Connection: keep-alive\n\n'],Header). request_header_file(_ファイル,_ファイル) :- sub_atom(_ファイル,0,1,_,'/'),!. request_header_file(_ファイル,_整形されたファイル) :- \+(sub_atom(_ファイル,0,1,_,'/')), concat_atom(['/',_ファイル],_整形されたファイル),!. hp_work_client(Socket,Header,DataList) :- open(Socket, read, Input), open(Socket, write, Output), write_formatted(Output,'%t',[Header]), flush_output, findall(X,(repeat,get_line(Input,_診断,Data),(_診断=終了,!,fail;true)),DataList), close(Input), close(Output), socket_shutdown(Socket). % 以下のサイトは # 出典:: 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',[_回答]),!. % 以下のサイトは # ただし、以下の条件を満たすようにすること # クライアントでquitが入力された場合、クライアントは接続を切りプログラムを # 終了し、サーバは接続が切れたら、次のクライアントの接続を待つ。 # サーバでquitが入力された場合、サーバは接続を切り、次のクライアントの # 接続を待ち、クライアントは接続が切られたらプログラムを終了する # エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を # 入力させて、その文字列を送るようにする メッセージの送受信(Input,Output,_クライアントからのメッセージ,_サーバからのメッセージ) :- write_formatted('%t\n',[_クライアントからのメッセージ]), get_line(_サーバからのメッセージ),!. 応答型サーバ(_ポート,_ログ) :- socket(internet,stream,Socket), socket_bind(Socket,_ポート), 応答型サーバ(Socket,[],_ログ), socket_shutdown(Socket). 応答型サーバ(Socket,[[end_of_file,_]|R],R) :- !. 応答型サーバ(Socket,[[A,quit]|R],[[A,quit]|R]) :- !. 応答型サーバ(Socket,L1,L2) :- socket_listen(Socket), socket_accept(Socket,Host : _ポート2,NewSocket), open(NewSocket,read,Input), open(NewSocket,write,Output), メッセージの送受信(Input,Output,_クライアントからのメッセージ,_応答型サーバからのメッセージ), close(Input), close(Output). socket_shutdown(NewSocket), 応答型サーバ(Socket,[[クライアントからの_メッセージ,_応答型サーバからのメッセージ]|L1],L2). サーバメッセージの送信(Output,quit) :- !. サーバメッセージの送信(Output,_メッセージ) :- put_line(Output,_メッセージ),!. クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび),!. クライアント(_ホスト,_舫,_差し込み口) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), write('サーバーに送信するメッセージを入れてください : '), get_line(_送信メッセージ), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび), write_formatted('受信した文字列は %t \n',[_受信文字列]). クライアント通信確立(_ホスト, _サービス, _差し込み口) :- 定数(_サービス), !, net_service(_サービス, tcp, _舫), socket(internet, stream, _差し込み口), host_addr(_ホスト, Addr), socket_connect(_差し込み口, Addr : _舫). クライアント通信確立(_ホスト, _舫, _差し込み口) :- 整数(_舫), !, socket(internet, stream, _差し込み口), socket_connect(_差し込み口, _ホスト : _舫). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび) :- write_formatted(_出力,'%t\n\n',[_送信メッセージ]), flush_output(_出力), get_code(_入力,Code), クライアント受信(_入力,Code,_受信文字コードならび). クライアント受信(_入力,(-1),[]) :- !. クライアント受信(_入力,_文字コード,[_文字コード|R]) :- get_code(_入力,_文字コード2), クライアント受信(_入力,_文字コード2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/94 # # [1] 授業単元: 通信プロトコル # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10268.txt # tcpを用いて21個石がある中から1〜3個の石をServer、Clientで取り合い、 # 最後の1つを取った方が負けとなる石取りゲームを作りなさい。 # server、clientの処理、および使用するポートは自由に決めて構わない。 クライアント一般型(Server,Port,_述語名,_受け取った情報) :- socket(internet, stream, Socket), socket_connect(Socket, Server : Port), open(Socket,read,Input), open(Socket,write,Output), クライアント一般型_1(Input,Output,_述語名,Line). クライアント一般型_1(_,Input,Output,_述語名,_受け取った情報) :- get_line(Line), クライアント一般型_2(Input,Output,Line,_述語名,_受け取った情報). クライアント一般型_1(Socket,Input,Output,_,_) :- close(Input), close(Output), socket_shutdown(Socket),!. クライアント一般型_2(Input,Output,_,end_of_file,end_of_file) :- !. クライアント一般型_2(Input,Output,_,_受け取った情報,_受け取った情報). クライアント一般型_2(Input,Output,_述語名,Line1,_受け取った情報) :- functor(P,_述語名,Arg), arg(1,P,Line1), arg(2,P,Message), call(P), write_formatted(Output,%t\n,[Message]), flush_output(Output), get_line(Line2), クライアント一般型_2(Input,Output,_述語名,Line2,_受け取った情報). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/442 # # 【 課題 】h ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/820.txt # 【 形態 】2. Applet # 1)各自のPC1とPC2のそれぞれにサーバーをたてる。 # サーバー1,2:メッセージを受け、自分のメッセージを付加(アペンド)して返す。 # # 2)その両方のサーバーに交信する以下のクライアントを作成する。 # クライアント:一方のサーバーにメッセージを送り、 # サーバーは、それまでにクライアントから来たメッセージを貯め、まとめて返す。 # Localhostではなく実際にipアドレスを確認し、複数のプロセッサ間の動作を # 確認すること。 サーバー(_舫い) :-   socket(internet,stream,Socket),   socket_bind(Socket,_舫い),   サーバー(_舫い,[]),   socket_shutdown(Socket). サーバー(_舫い,['shutdown -h server'|_]) :- !. サーバー(_舫い,_メッセージならび) :-   socket_listen(Socket),   socket_accept(Socket,Host : _舫い2,NewSocket),   open(NewSocket,read,Input),   open(NewSocket,write,Output),   get_line(Input,Line),   append(_メッセージならび,[Line],_メッセージならびの二),   サーバーメッセージの送信(Output,_メッセージならびの二),   close(Input),   close(Output).   socket_shutdown(NewSocket),   サーバー(_舫い,_メッセージならびの二). サーバーメッセージの送信(Output,_メッセージならび) :-   member(_メッセージ,_メッセージならび),   put_line(Output,_メッセージ),   fail. サーバーメッセージの送信(Output,_). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび),!. クライアント(_ホスト,_舫,_差し込み口) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), write('サーバーに送信するメッセージを入れてください : '), get_line(_送信メッセージ), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび), write_formatted('受信した文字列は %t \n',[_受信文字列]). クライアント通信確立(_ホスト, _サービス, _差し込み口) :- 定数(_サービス), !, net_service(_サービス, tcp, _舫), socket(internet, stream, _差し込み口), host_addr(_ホスト, Addr), socket_connect(_差し込み口, Addr : _舫). クライアント通信確立(_ホスト, _舫, _差し込み口) :- 整数(_舫), !, socket(internet, stream, _差し込み口), socket_connect(_差し込み口, _ホスト : _舫). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび) :- write_formatted(_出力,'%t\n\n',[_送信メッセージ]), flush_output(_出力), get_code(_入力,Code), クライアント受信(_入力,Code,_受信文字コードならび). クライアント受信(_入力,(-1),[]) :- !. クライアント受信(_入力,_文字コード,[_文字コード|R]) :- get_code(_入力,_文字コード2), クライアント受信(_入力,_文字コード2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/231 # # 【 形態 】Javaアプリケーション(main()で開始) # 【 課題 】以下のようなサーバプログラムCountServer.javaとクライアントプログラム # CountClient.javaを作成してください。 # # [条件] # ・サーバは、クライアントから文字列を受信し、その文字数をカウントして #  結果をクライアントに返す。 # ・クライアントプログラムを実行時に、コマンドラインから、サーバホスト名 #  java CountClient サーバホスト名 "文字列" # ・クライアントは、サーバからの結果を受け取り、画面に表示する。 # ・サーバは、ポート番号 4321 で接続要求を受け付けるようにする。 # # サーバプログラムの実行 # >java CountServer # # クライアントプログラムの実行と実行結果 # >java CountClient host1 "Java Programming" # 16   server(Port) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket), socket_accept(Socket,Host : Port2,NewSocket), socket_raw_receive(NewSocket,8192,_,_受信コードならび,_実際に受信した長さ), atom_codes(_受信した文,_受信コードならび), server_1(_受信した文,NewSocket), Message = quit, socket_shutdown(Socket),!. server_1(quit,NewSocket,Input,Output) :- socket_shutdown(NewSocket),!. server_1(_受信した文,NewSocket) :- atom_codes(Message,L), atom_length(Message,Length), open(NewSocket,write,Output,[type(binary)]), write_formatted(Output,'%t\r\n',[Length]), flush_output(Output), close(Output), socket_shutdown(NewSocket), ! . client(Host,Port) :- get_line(_伝送する文), socket(internet, stream, Socket), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), write_formatted(Output,'%t\n',[_送信する文]), flush_output(Output), get_line(Input,_受信した文), client_1(_受信した文,Host,Socket,Input,Output), close(Input), close(Output), socket_shutdown(Socket). client_1(end_of_file,Input,Output) :- !. client_1(_受信した文,Input,Output) :- write_formatted('%t\n',[_受信した文]), get_line(Input,_次の受信した文), client_1(_次の受信した文,Input,Output). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/574 # # [1] 授業単元:プログラミング序論演習 # [2] 問題文(含コード&リンク): CUI上で動くメーラーを作れ :- op(850,fx,rm). rm(File) :- concat_atom(['rm -f ',File],S), system(S),!. % *** user: mail / 1 *** mail(max) :- 'メール数の確認'(N), mail(N),!. mail(0) :- reconsult('listing/最終メール番号#1.pro'), 'メール数の確認'(N), '最終メール番号'(N2), M is N2 - N, ( M < 0, mail(M), retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ; M = 0 ; M > 0, retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ), !. mail(0) :- !. mail(N) :- N < 0, !, 'メール数の確認'(Max), rm tempmsg, abolish('受信先アドレス' / 1), reconsult('listing/最終メール番号#1.pro'), for(-1,M,N), open(tempmsg,append,Output), M2 is Max + M + 1, write(Output,'\n\n'), '返信入力表示'(Output,M2), close(Output), M = N, exists(tempmsg,read), cat tempmsg, '最終メール番号の保存', !. mail(N) :- N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), ! 'cat tempmsg | nkf -We', write('\n'), !. mail(N) :- \+(N = 0), exists(tempmsg,read), ! 'cat tempmsg | nkf -We', write('\n'), !. % *** user: mail10 / 1 *** mail10(N) :- integer(N), N < 0, 'メールの数を調べる'(Max), S is Max + N + 1, for(S,M,Max), write_formatted('\n#%t\n',[M]), mail10(M), M = Max, !. mail10(S - E) :- for(S,N,E), write_formatted('\n#%t\n',[N]), mail10(N), N = E, !. mail10(N) :- integer(N), \+(N = 0), N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), shs('cat tempmsg | nkf -We',L), member(A,L,R2), subatomic(A,1,7,'Status:'), for(1,M,10), list_nth(M,R2,X), write_formatted('%t\n',[X]), M = 10, !. % *** user: 'メール数の確認' / 2 *** 'メール数の確認'(_メールボックス,_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メール数の確認' / 1 *** 'メール数の確認'(_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, stream_read(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールの数を調べる' / 1 *** 'メールの数を調べる'(_メールの数) :- 'メールサーバ'(_メールサーバ), 'クライアント通信確立'(_メールサーバ,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_),fail)), _私書箱 = takao ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_私書箱]), flush_output(_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), repeat, get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メールの数), \+(_メールの数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), ! . % *** user: 'メールを読む' / 6 *** 'メールを読む'(_メールボックス,N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), get_line(_入力,C), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 5 *** 'メールを読む'(L,A,B,C,X) :- list(L), 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力,A), open(_差し込み口,write,_出力,B), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), get_line(_入力,C), ( member(N,L), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), fail ; true ), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. 'メールを読む'(N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 2 *** 'メールを読む'(N,X) :- var(X), integer(N), N =< 0, 'メール数の確認'(_メール数), M is _メール数 + N + 1, 'メールを読む'(M,_,_,_,X), concat_atom(X,'\n',_文), open(tempmsg,append,_出力2), write_formatted(_出力2,'%t',[_文]), flush_output(_出力2), close(_出力2), !. 'メールを読む'(N,FILE) :- \+(var(FILE)), integer(N), N =< 0, 'メールサーバアドレス'(_メールサーバアドレス), 'クライアント通信確立'(_メールサーバアドレス,110,_差し込み口), ( FILE = '', tmpnam(FILE_1) ; \+(FILE = ''), FILE = FILE_1 ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールを読むの一'(N,FILE_1,_入力,_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読むの一' / 4 *** 'メールを読むの一'(N,FILE,_入力,_出力) :- 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), 'メール数の取得'(_入力,_メール数), _限界数 is _メール数 + N + 1, 'メールの取得'(_入力,_出力,FILE,_メール数,_限界数), 'メールサーバを切り離す'(_入力,_出力), !. % *** user: 'メールの取得' / 5 *** 'メールの取得'(_入力,_出力,FILE,Max,M) :- open(FILE,append,_出力2), write(_出力2,'\n'), for(Max,U,M), write_formatted(_出力,'RETR %t\r\n',[U]), flush_output(_出力), pop3_message_rw(_入力,_出力2), write(_出力2,'.\n'), U = M, write(_出力2,'\n'), close(_出力2), !. % *** user: pop3_message_rw / 2 *** pop3_message_rw(Input,Output) :- repeat, get_line(Input,S), replace_all(S,'\r','',S2), ( subatomic(S,1,1,'.') ; S = end_of_file ; S2 = [], write(Output,'\n'), fail ; \+(S2 = []), write_formatted(Output,'%t\n',[S2]), fail ),!. % *** user: pop3_message_get / 2 *** pop3_message_get(A,B) :- findall(E,(repeat , get_line(A,C) , replace_all(C,'\r','',D) , (sub_atom(C,0,1,'.') , (!) , fail ; C = end_of_file , (!) , fail ; D = [] , E = '\n' ; not D = [] , E = D)),B),!. % *** user: 'メール数の取得' / 2 *** 'メール数の取得'(_入力,_メール数) :- get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数). % *** user: 'メールパスワードの送付' / 3 *** 'メールパスワードの送付'(_メールボックス,_入力,_出力,B) :- メールパスワード(_メールボックス,_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールパスワードの送付' / 2 *** 'メールパスワードの送付'(_入力,_出力) :- メールパスワード(_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールユーザ名の送付' / 3 *** 'メールユーザ名の送付'(_メールボックス,_入力,_出力,A) :- メールユーザ(_メールボックス,_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールボックス]), flush_output(_出力). 'メールユーザ名の送付'(_入力,_出力) :- メールユーザ(_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールユーザ]), flush_output(_出力). % *** user: 'メールサーバを切り離す' / 2 *** 'メールサーバを切り離す'(_入力,_出力) :- write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D),!. smtp_iso(From,To,Subject,'文'(_文)) :- tmpnam(TMPNAM), tmpnam(TMPNAM2), open(TMPNAM,write,Output), write_formatted(Output,'%t\n',[_文]), close(Output), concat(['nkf -e -j ',TMPNAM,' >',TMPNAM2],S), system(S), smtp_iso(Input,Output,From,To,Subject,TMPNAM2,_診断), unlink(TMPNAM), unlink(TMPNAM2),!. smtp_iso(From,To,Subject,File) :- \+(list(File)), tmpnam(TMPFILE), concat(['nkf -e -j ',File,' >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), smtp_iso(Host,From,To,MimeSubject,TMPFILE,_診断), unlink(TMPFILE),!. smtp_iso(From,To,Subject,Files) :- list(Files), smtp_plus(Files,File1,Boundary), tmpnam(TMPFILE), concat(['cat ',File1,' | nkf -e -j >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), stmp_iso(Host,From,To,MimeSubject,TMPFILE,Boundary,_診断),!. % *** user: smtp_iso / 2 *** smtp_iso(To,(?- _質問)) :- tmpnam(TMPNAM), tell(TMPNAM), write_formatted('%q.\n',[(?- _質問)]), told, smtp_iso(To,'prolog@takao.ozaki.name','質問',TMPNAM), ! . % *** user: smtp_iso / 6 *** smtp_iso(_送信元,_送信先,MimeSubject,File,Data,_診断) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,38,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), send_helo(Input,Output,Domain), send_from_to(Input,Output,_送信元,_送信先), send_data(Input,Output,Subject,_送信元,_送信先,Data), send_quit(Input,Output), shutdown(_差し込み口),!. send_helo(Input,Output,Domain) :- write_formatted(Output,'HELO %t\r\n',[Domain]), read(Input,_), write_formatted(Output,'EHLO %t\r\n',[Domain]), read(Input,_),!. send_from_to(Input,Output,From,To) :- write_formatted(Output,'MAIL FROM: %t\r\n',[From]), stream_read(Input,_), write_formatted(Output,'RCPT TO: %t\r\n',[To]), stream_read(Input,_),!. send_data(Input,Output,Subject,From,To,Data) :- write_formatted('DATA\r\n',[]), stream_read(Input,_), write_formatted(Output,'Subject: %t\r\nFrom: %t\r\nTo: %t\r\n\r\n',[Subject,From,To]), write_formatted(Output,'%t',[Data]), get_line(Input,_),!. send_quit(Input,Output) :- write_formatted(Output,'QUIT\r\n'), get_line(Input,_),!. % *** user: smtp_plus / 3 *** smtp_plus(FileList,File,Boundary) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), Boundary = '------------000402050407020604050408', smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('This is a multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2,R), told,!. % *** user: smtp_plus_1 / 2 *** smtp_plus_1(Boundary,File) :- write_formatted('--%t\n',[Boundary]), write('Content-Type: text/plain; charset=EUC-JP\n'), write('Content-Transfer-Encoding: 8bit\n\n'), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), write('\n'), write('\n'), close(Fp),!. % *** user: smtp_plus_2 / 3 *** smtp_plus_2(Boundary,[],_) :- write_formatted('\n--%t--\n',[Boundary]), write('.\n\n'),!. smtp_plus_2(Boundary,[File|R],[File_1|R2]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('\n--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File_1]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File_1]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), smtp_plus_2(Boundary,R,R2). % *** user: smtp_plus_2 / 2 *** smtp_plus_2(_,[]) :- write('.\n\n'),!. smtp_plus_2(Boundary,[File|R]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), write_formatted('\n--%t--\n',[Boundary]), smtp_plus_2(Boundary,R). % *** user: smtp_plus / 2 *** smtp_plus(FileList,File) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), concat([--------------------,A1,A2,A3],AX), replace_all(AX,'/tmp/','',Boundary), smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('Content-Type: multipart/mixed;\n'), write_formatted(' boundary="%t"\n\n',[Boundary]), write('This is multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2), told, !. % *** user: smtp_file_mime / 2 *** smtp_file_mime(jpg,'image/jpeg') :- !. smtp_file_mime(jpeg,'image/jpeg') :- !. smtp_file_mime(txt,'text/plain') :- !. smtp_file_mime(xls,xls) :- !. smtp_file_mime(csv,csv) :- !. smtp_file_mime(html,'text/html') :- !. smtp_file_mime(ps,'application/postscript') :- !. smtp_file_mime(pdf,'application/postscript') :- !. smtp_file_mime(_,'text/plain') :- !. % *** user: smtp_file_suffix / 2 *** smtp_file_suffix(File,Suffix) :- decompcons(File,L), ( smtp_file_suffix_2(L,L2), concat(L2,Suffix) ; \+(smtp_file_suffix_2(L,_)), Suffix = txt ),!. % *** user: smtp_file_suffix_2 / 2 *** smtp_file_suffix_2(['.'|R],R) :- !. smtp_file_suffix_2([_|R1],R2) :- smtp_file_suffix_2(R1,R2). % *** user: smtp_plus_base64_encode / 2 *** smtp_plus_base64_encode([],[]) :-!. smtp_plus_base64_encode([File1|R1],[File2|R2]) :- base64_file_encode(File1,File2), smtp_plus_base64_encode(R1,R2). % *** user: 'クライアント通信確立' / 3 *** 'クライアント通信確立'(_ホスト,_サービス,_差し込み口) :- '定数'(_サービス), !, net_service(_サービス,tcp,_舫), socket(internet,stream,_差し込み口), host_addr(_ホスト,Addr), socket_connect(_差し込み口,Addr : _舫). 'クライアント通信確立'(_ホスト,_舫,_差し込み口) :- '整数'(_舫), !, socket(internet,stream,_差し込み口), socket_connect(_差し込み口,_ホスト : _舫). % *** user: get_line / 2 *** get_line(Stream,S) :- error_protect(get_code(Stream,X_4),X_4 = -1), get_line_1(Stream,X_4,L_4,[]), atom_codes(S,L_4), ! . get_line_1(Stream,10,[],[]) :- !. get_line_1(Stream,10,L,L2) :- !, reverse(L2,L). get_line_1(Stream,10,L_4,[13|L1_4]) :- !, reverse(L1_4,L_4). get_line_1(Stream,31,L_4,L1_4) :- !, reverse(L1_4,L_4). get_line_1(Stream,-1,L,[A|L1]) :- reverse([A|L1],L). get_line_1(Stream,-1,[101,110,100,95,111,102,95,102,105,108,101],L2) :- !. get_line_1(Stream,X_4,L_4,L1_4) :- error_protect(get_code(Stream,Y_4),Y_4 = -1), !, get_line_1(Stream,Y_4,L_4,[X_4|L1_4]). base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/904 # # ・課題の内容 # TCP/IPプロトコルを用い、通信するプログラムを作成せよ。 # ・条件 # キーボードから文字列を1行入力し、それを送信するプログラム(tcp_snd1)と、 # それを受信するプログラム(tpc_rec1)の2つを作成せよ。 # tcp_snd1では、送信先の計算機の名前をプログラムの引数で指定できるようにせよ。 # tcp_rec1では、コネクションの要求あったら、コネクションを張り、 # 要求した計算機のIPアドレスを表示せよ。 # メッセージを受信するたびに、通信回数を[]で括って表示し、 # その後にメッセージを表示せよ。 # 空行が入力されたら、tcp_snd1もtcp_rec1の双方が終了するようにせよ。 # ポートとして、9000を利用せよ。 tcp_snd1(Host) :- socket(internet, stream, Socket), host_addr(Host,9000), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), get_line(Line), send_message(Line,Host,Socket,Input,Output), write(Output,'\n'), close(Input), close(Output), socket_shutdown(Socket). send_message(end_of_file,Host,Input,Output) :- !. send_message(Line,Host,Input,Output) :- write_formatted(Output,'%t\n',[Host,Line]), flush_output(Output), get_line(Line2), send_message(Line,Host,Input,Output), get_line(Input,_). tcp_rcv1 :- socket(internet, stream, Socket), socket_bind(Socket, 9000), socket_listen(Socket), socket_accept(Socket,Host:Port,NewSocket), write_formatted('Accept Host:%t\n',[Host]), open(NewSocket,read,Input), open(NewSocket,write,Output), for(1,N,2000000000), get_line(Input,Line), return_message(N,Line,Status), Status == end_of_file, close(Input), close(Output), socket_shutdown(Socket), socket_shutdown(NewSocket). return_message(N,'',end_of_file) :- !. return_message(N,Line,ok) :- write_formatted('[%t]%t\n',[N,Line]), write(Output,'ok\n').