Comment detail

echoクライアント (Nested Flatten)

echoのプロトコル(RFC862)に詳しくないのですが、サーバ側からデータの終わり(eofなど)が返ってこないようなので、タイムアウト(10秒)を設定してみました(汗

送信したデータと比較して、同じならcloseする条件もつけました。

escriptが利用可能な環境であれば、以下のようにコマンドラインから実行可能です。

$ ./スクリプト名 localhost 7 < testfile > newfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env escript
main([Hostname, Port])->
        Str = loop(io:get_line(standard_io,''), []),
        Res = gen_tcp:connect(Hostname,
                        list_to_integer(Port),
                        [binary, {packet, 0}]),
        case Res of
                {ok, Socket} ->
                        ok = gen_tcp:send(Socket, Str),
                        receive_data(Socket, [], lists:flatten(Str));
                {error, Why} -> io:format("error ~p~n", [Why]), exit(eError)
        end.

receive_data(Socket, _Original, _Original) ->
                gen_tcp:close(Socket);
receive_data(Socket, SoFar, Original) ->
        receive
                {tcp, Socket, Bin} ->
                        Lines = binary_to_list(Bin),
                        io:format("~s", [Lines]),
                        receive_data(Socket, lists:flatten(SoFar ++ [Lines]), Original);
                {tcp_closed, Socket} ->
                        ok
        after 10000 ->
                gen_tcp:close(Socket)
        end.

loop(eof, SoFar)->
    lists:reverse(SoFar);
loop(Data, SoFar) ->
    loop(io:get_line(''), [Data|SoFar]).

Index

Feed

Other

Link

Pathtraq

loading...