このディレクトリの索引

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').