[erlang-questions] Erlang OTP design principle

Eranga Udesh casper2000a@REDACTED
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?

- Eranga

-----Original Message-----
From: Ulf Wiger (TN/EAB) [mailto:ulf.wiger@REDACTED] 
Sent: Monday, June 11, 2007 2:48 PM
To: Eranga Udesh; erlang-questions@REDACTED
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


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.)

Ulf W

> -----Original Message-----
> From: erlang-questions-bounces@REDACTED 
> [mailto:erlang-questions-bounces@REDACTED] On Behalf Of Eranga Udesh
> Sent: den 11 juni 2007 07:08
> To: erlang-questions@REDACTED
> 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
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions

More information about the erlang-questions mailing list