[erlang-questions] Erlang OTP design principle

Eranga Udesh <>
Tue Jul 10 09:16:56 CEST 2007


Using {active, once} or {active, true} instead of gen_tcp:recv, I can use a
gen_server or my own OTP compliant process to receive TCP messages.

But what about gen_tcp:accept? Since this is a blocking function, if I try
to do a code load, the Acceptor Thread gets killed? Is there anyway that I
can write this better?

BRgds,
- Eranga




-----Original Message-----
From: Ulf Wiger (TN/EAB) [mailto:] 
Sent: Monday, June 11, 2007 2:48 PM
To: Eranga Udesh; 
Subject: RE: [erlang-questions] Erlang OTP design principle


If you want to be able to handle messages while
waiting for a TCP message, you may want to use
inet:setopts(Sock, [{active, once}]), and then
wait for the packet in a normal receive clause.

If the waiting is done in e.g. a gen_server, you
get the handling of system messages for free.
Otherwise, you need to read the OTP Design Principles
document, 

http://www.erlang.org/doc/doc-5.5.4/doc/design_principles/part_frame.htm
l

chapter 6.2 "Special Processes", on how to handle
system messages on your own.

(or use something like plain_fsm in Jungerl, if 
you really want to write textbook receive clauses.)

BR,
Ulf W

> -----Original Message-----
> From:  
> [mailto:] On Behalf Of Eranga Udesh
> Sent: den 11 juni 2007 07:08
> To: 
> Subject: [erlang-questions] Erlang OTP design principle
> 
> Hi,
> 
> What's the best way to make do_recv/2 function below, OTP 
> compliant? I.e. it should receive messages from other 
> processes, handle code update requests, terminate, etc.
> 
> Why gen_tcp, gen_udp, etc., are written as behaviors like 
> gen_server, so that in a handle_*, it will receive incoming 
> messages, etc?
> 
> Thanks,
> - Eranga
> 
> 
> 
> 
> server() ->
>     {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0}, 
>                                         {active, false}]),
>     {ok, Sock} = gen_tcp:accept(LSock),
>     {ok, Bin} = do_recv(Sock, []),
>     ok = gen_tcp:close(Sock),
>     Bin.
> 
> do_recv(Sock, Bs) ->
>     case gen_tcp:recv(Sock, 0) of
>         {ok, B} ->
>             do_recv(Sock, [Bs, B]);
>         {error, closed} ->
>             {ok, list_to_binary(Bs)}
>     end.
> 
> 
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
> 




More information about the erlang-questions mailing list