[erlang-questions] Erlang OTP design principle

igwan <>
Tue Jul 10 12:58:08 CEST 2007


Hi,

I had a similar issue last month. This post might be of interest to you 
: http://www.erlang.org/pipermail/erlang-questions/2007-June/027555.html
In short, you can make the accept mechanism asynchronous, but at the 
price of using internal undocumented functions 
(prim_inet:async_accept/2). It returns immediately and sends your 
process a message when a new connection arrives on your listening 
socket. For the format of the message received, it's best to look in the 
prim_inet.erl, especially how the accept (synchronous) function works. 
It seems that upon receiving the message you have to get opts from the 
listening socket, and set them to the new connection socket.

igwan


Eranga Udesh a écrit :
> 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
>>
>>     
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>   




More information about the erlang-questions mailing list