%%% -*- mode: erlang -*- %%% $Id: echo.erlang,v 1.6 2001/06/09 00:02:04 doug Exp $ %%% http://www.bagley.org/~doug/shootout/ %%% with help from Sebastian Strollo %%% TBD - need to add check for valid response. -module(echo). -export([main/0, main/1, client/2, server/1]). -define(DATA, <<"Hello there sailor\n">>). main() -> main(['1']). main([Arg]) -> N = list_to_integer(atom_to_list(Arg)), ServerSock = create_server_sock(), spawn(?MODULE, client, [N, socket_port(ServerSock)]), server(ServerSock), init:stop(). create_server_sock() -> {ok, LSock} = gen_tcp:listen(0, [binary]), LSock. socket_port(Sock) -> {ok, Port} = inet:port(Sock), Port. client(N, ServerPort) -> {ok, Sock} = gen_tcp:connect("localhost", ServerPort, [binary]), client_loop(N, Sock), gen_tcp:close(Sock). client_loop(0, Sock) -> ok; client_loop(N, Sock) -> ok = gen_tcp:send(Sock, ?DATA), receive {tcp, Sock, _} -> client_loop(N-1, Sock); {tcp_closed, Sock} -> ok end. server(LSock) -> {ok, Sock} = gen_tcp:accept(LSock), server_loop(Sock, 0), gen_tcp:close(LSock). server_loop(Sock, Bytes) -> receive {tcp, Sock, Packet} -> ok = gen_tcp:send(Sock, Packet), server_loop(Sock, Bytes + size(Packet)); {tcp_closed, Sock} -> io:format("server processed ~w bytes~n", [Bytes]), gen_tcp:close(Sock) end.