kgbu #7677(2008/09/18 11:05 GMT) [ Erlang ] Rating0/0=0.00
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]).
Rating0/0=0.00-0+
[ reply ]
kgbu #7677() [ Erlang ] Rating0/0=0.00
echoのプロトコル(RFC862)に詳しくないのですが、サーバ側からデータの終わり(eofなど)が返ってこないようなので、タイムアウト(10秒)を設定してみました(汗
送信したデータと比較して、同じならcloseする条件もつけました。
escriptが利用可能な環境であれば、以下のようにコマンドラインから実行可能です。
$ ./スクリプト名 localhost 7 < testfile > newfile
#!/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]).Rating0/0=0.00-0+
[ reply ]