<div dir="ltr">Thanks Roger, that makes sense. And no, I'm not trying to build my own socket acceptor pool; that's probably too ambitious. Just working through Joe's book for now 😉.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 6, 2018 at 3:51 AM, Roger Lipscombe <span dir="ltr"><<a href="mailto:roger@differentpla.net" target="_blank">roger@differentpla.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">It's worth pointing out that certain 'raw' options only apply to the<br>
listening socket, and are not consistently inherited by (or<br>
transferred to) the accepting/connected socket. For example, on Linux,<br>
TCP keep-alive settings can be applied to the listening socket, and<br>
they'll be copied to the connected socket. On macOS, this (a) doesn't<br>
work, and (b) does other weird, unexpected things.<br>
<br>
Note also that you probably *don't* want to set {active, true} in<br>
listen/2 in a real application, because you're probably going to hand<br>
the socket off to another process (using<br>
gen_tcp:controlling_process/2)<wbr>, and this'll cause you to miss the<br>
occasional message during that window.<br>
<br>
And, frankly, if you're building your own socket acceptor pool,<br>
*don't*. Just use ranch (<a href="https://github.com/ninenines/ranch" rel="noreferrer" target="_blank">https://github.com/ninenines/<wbr>ranch</a>).<br>
<div class="HOEnZb"><div class="h5"><br>
On 6 February 2018 at 05:55, Tianxiang Xiong <<a href="mailto:tianxiang.xiong@gmail.com">tianxiang.xiong@gmail.com</a>> wrote:<br>
> In Joe's Programming Erlang 2nd E, Chpt. 17, pg. 274, he says:<br>
><br>
>> After we have accepted a connection, it’s a good idea to explicitly set<br>
>> the required socket options, like this:<br>
><br>
><br>
> {ok, Socket} = gen_tcp:accept(Listen),<br>
> inet:setopts(Socket, [{packet,4},binary,{nodelay,<wbr>true},{active, true}]),<br>
> loop(Socket)<br>
><br>
> Until then the book's been doing:<br>
><br>
> {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true},<br>
> {active, true}])<br>
> {ok, Socket} = gen_tcp:accept(Listen),<br>
> ...<br>
> loop(Socket)<br>
><br>
> Is there a reason we need to set the options after accept? Is it necessary<br>
> to set options on listen and accept?<br>
><br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> ______________________________<wbr>_________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
><br>
</div></div></blockquote></div><br></div>