[erlang-questions] Line Receiver example?

Joe Armstrong <>
Mon Apr 27 21:44:50 CEST 2009


A basic server looks something like this:

start_server() ->
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},
					 {active, true}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),
    loop(Socket).

loop(Socket) ->
    receive
	{tcp, Socket, Bin} ->
	    io:format("Server received binary = ~p~n",[Bin]),
	    ...
	    loop(Socket);
	{tcp_closed, Socket} ->
	    io:format("Server socket closed~n")
    end.

Now you want to call a function every time a "line" is received
If the function is F you can modify the code as follows:

(Compare this with the original)

start_server(F) ->
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},
					 {active, true}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),
    loop(Socket, F).

loop(Socket, F) ->
    receive
	{tcp, Socket, Bin} ->
	    io:format("Server received binary = ~p~n",[Bin]),
	    ...
	    F(Bin),	
	    loop(Socket, F);
	{tcp_closed, Socket} ->
	    io:format("Server socket closed~n")
    end.

Once you see how the arguments flow it should be easy to change the
examples in the book :-)

To start do something like

Now define your handling fun

myfun(Bin) ->
    ....

start with:

spawn(fun() -> start_server(fun myfun/1).

	
The idea of what a "line" is can be changed by setting different
options when opening the socket.

Cheers

/Joe




On Mon, Apr 27, 2009 at 6:31 PM, Jarrod Roberson <> wrote:
> I am desperately trying to convert the example code from the SHOUTCast
> server example in the Programming Erlang book to call a function on every
> line received instead of the way it works in the book.
> I am coming from using the Twisted framework for Python and trying to port
> some applications, Twisted has a "Line Receiver" protocol that calls a
> function when every line is detected.
> It makes writing basic protocols very easy. I have been unsuccessful in
> trying to accomplish the same thing with Erlang.
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list