managing the tcp/ip data flow and internal messages

info <>
Thu Oct 22 16:52:51 CEST 2009


I'm using gen_server to manage several socket connections.
For each connection a process is running, listen a client, reading with gen_tcp:recv

loop(S)->
    case gen_tcp:recv(S,0)->
    {ok,Data} ->
        %% handle data
        loop(S);
    {error,closed} ->
        exit( normal)
    end.

Now I would like to complicate the situation ...
I would like, from another gen_server, to send data to a specific client !

My first problem is to find the process "attached" to a client. Probably I must associate an ident (the client) to each process.
My second problem is to not disturb the tcp/ip connection. I suppose I must use {active,once} and the instruction "receive".

loop(S)->
    inet:setopts(S,[{active,once}]),
    receive
    {tcp,S,Data} ->
        %%handle data
    {tcp_close,S}->
        %%handle close
    {tcp_error,S,Reason}->
        %%handle reason
    {message,Data}->
        gen_tcp:send(S,Data),
        ...
    end.

Is my approach coherent ? robust ? yes/no why ?

John


More information about the erlang-questions mailing list