<div dir="ltr">Hi Stephane,<br><br>The process which calls `gen_tcp:accept(LSock)` becomes what is called the "controlling process" of the socket. It will receive data on the socket as messages in the form {tcp, Socket, Data}. Strictly speaking the _Socket is not needed for you to receive active messages like this. But you can't tell different sockets apart from each other. And worse, since you have no reference to the socket, you can't close the socket and you can't change it's properties. The only way to close the socket is by terminating the (worker) process who is the controller. There are no other ways around this. And usually, I would call this way of coding rather bad style.<div><br></div><div>There is no function `supervisor:start_child/0` so your friends code will not work, but will fail. There has to be something intricate going on here if the code works. Usually, you arrange it such that the right process is the one calling accept, so the right process becomes the controller. Or you give away control by calling the gen_tcp call to change the controlling process to another. However, when doing so, care must be taken since the listen socket is active by default, so a race might occur where the wrong process ends up with a message.</div><div><br></div><div>Finally, I would recommend your friend to use {active, once} semantics instead of {active, true} since it removes the situation where a fast peer can outrun your Erlang code. Instead, the principles of flow control will be invoked by TCP once the receiver window fills up, allowing you to handle data at the pace your system can digest. <br><div><br></div><div><br><div class="gmail_quote">On Tue Dec 23 2014 at 9:02:45 PM Stéphane Wirtel <<a href="mailto:stephane@wirtel.be" target="_blank">stephane@wirtel.be</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
In an example from a friend, I see this code.<br>
<br>
For the listener<br>
```<br>
{ok, ListeningSocket} = gen_tcp:listen(2525, [{active, true}])<br>
```<br>
<br>
And for each worker, there is part in the code of the supervisor.<br>
<br>
```<br>
{ok, _Socket} = gen_tcp:accept(<u></u>ListeningSocket<u></u>)<br>
<br>
supervisor.start_child()<br>
```<br>
<br>
the code executes a new worker for this client, but I don't understand<br>
how the child process can handle the new client connection,<br>
because he does not pass the _Socket variable to supervisor.start_child.<br>
<br>
Do you have a good explanation of this magic thing ?<br>
<br>
Thank you,<br>
<br>
Stephane<br>
--<br>
Stéphane Wirtel - <a href="http://wirtel.be" target="_blank">http://wirtel.be</a> - @matrixise<br>
______________________________<u></u><u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>list<u></u>info/erlang-questions</a><br>
</blockquote></div></div></div></div>