<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On 5 September 2013 13:56, Ahmed Omar <span dir="ltr"><<a href="mailto:spawn.think@gmail.com" target="_blank">spawn.think@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hi JD, <div>I think you are maybe confusing reuseadrr or (SO_REUSEADDR) usage in general.</div>
</div></blockquote><div><br></div><div>Yeah, only BSD worked the way I thought and still can't guarantee it completely. Thanks for the clear response and link! </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>AFAIK, In most sockets implementations, you can't bind two sockets with the same exact source(port/IP)/protocol combination. </div>
<div>That's not specific to Erlang, but to most used operating systems.</div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div><br></div><div><div>Here's a good read on the topic (specially the table for possible combination)<br></div><div>
<a href="http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t" target="_blank">http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t</a></div>
</div></div></blockquote><div><br></div><div>If this is correct (and it looks pretty well-thought-through) the BSD implementation should do what I want with SO_REUSEADDR but the linux implementation won't.<br><br>"BSD:... However, if SO_REUSEADDR is set for the socket you are trying to bind, another socket bound to the same address and port in state TIME_WAIT is simply ignored, after all its already "half dead", and your socket can bind to exactly the same address without any problem."<br>
"Linux:... This option behaves generally the as in BSD with two important exceptions. One exception is that a if a listening (server) TCP socket is already bound to a wildcard IP address and a specific port, no other TCP socket can be bound to the same port, regardless whether either one or both sockets have this flag set. Not even if it would use a more specific address (as is allowed in case of BSD)."<br>
<br>I can achieve what I want with Linux kernel 3.9+ and SO_REUSEPORT if OTP supporteds it, but that's irrelevant for my current kernel.<br></div><div><br></div><div>Lukas also mentioned that it could be that the emulator returns on the port close before the kernel actually puts the socket in TIME_WAIT (if I understood correctly) and SMP makes it tricky to get serial guarantees on things like this.</div>
<div><br></div><div>Both the BSD and Linux 3.9 would have potentially confusing behaviour since the old socket might still be listening when the new socket starts.</div><div><br></div><div>In the end, for my application, it's best accept that bind can fail and keep trying when the application is designed to rebind the port it had recently and the environment is designed for nothing else to be binding there.</div>
<div><br></div><div>JD</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">
<div>
<div><br></div><div><br></div></div><div>A simple example to show one scenario of using reuseaddr: </div><div>%Listening on a specific IP and on a wildcard </div><div><br></div><div><div>> {ok, LSock1} = gen_tcp:listen(12345, [{reuseaddr, true},{ip,{127,0,0,1}}]).</div>

<div>{ok,#Port<0.816>}</div><div>> {ok, LSock2} = gen_tcp:listen(12345, [{reuseaddr, true},{ip,{0,0,0,0}}]).  </div><div>{ok,#Port<0.817>}</div><div>> </div><div><br></div><div>%Same without reuseaddr:</div>

<div><br></div><div>> </div><div>> f().</div><div>ok</div><div>> {ok, LSock1} = gen_tcp:listen(12346, [{ip,{127,0,0,1}}]).                  </div><div>{ok,#Port<0.818>}</div><div>> {ok, LSock2} = gen_tcp:listen(12346, [{ip,{0,0,0,0}}]).  </div>

<div>** exception error: no match of right hand side value {error,eaddrinuse}</div><div><br></div><div>So in your case, sometimes it will succeed (if socket got actually closed before the next gen_tcp:listen call, and in other times will fail because the socket was not yet closed.</div>

<div><br></div><div>Does this answer your question?</div><div><br></div><div>Best Regards, </div><span class=""><font color="#888888"><div>Ahmed Omar</div><div><br></div></font></span></div></div><div class=""><div class="h5">
<div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Sep 5, 2013 at 10:27 AM, JD Bothma <span dir="ltr"><<a href="mailto:jbothma@gmail.com" target="_blank">jbothma@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div>On 5 September 2013 09:58, aman mangal <span dir="ltr"><<a href="mailto:mangalaman93@gmail.com" target="_blank">mangalaman93@gmail.com</a>></span> wrote:<br></div><div class="gmail_extra">
<div class="gmail_quote"><div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div><div dir="ltr">


<br></div><div dir="ltr">The error is thrown in the first line. It is returning <i>{error, </i><span style="font-family:arial,sans-serif;font-size:13px"><i>eaddrinuse}</i>  (where you are expeciting <i>{ok, LSock}</i>) because the port is already being used by some different process. Two process cannot listen on the same port at a time.</span></div>


</div></div></div></blockquote><div><br></div></div><div> <span style="font-family:arial,sans-serif;font-size:13px">It runs for a while, and sometimes gets through all bind/closes, but sometimes crashes mid-way.</span></div>

<div style="font-family:arial,sans-serif;font-size:13px">
<br></div><div style="font-family:arial,sans-serif;font-size:13px">reuseaddr should be telling the OS that the closing socket may be reused when this process tries to listen on the same port again. </div><div style="font-family:arial,sans-serif;font-size:13px">


<br></div><div style="font-family:arial,sans-serif;font-size:13px">No process was listening on this port before the test. This code should be ensuring that the OS allows listening on the socket even when the last close hasn't completely released the socket. Without reuseaddr, we can sometimes expect eaddrinuse because close returns before the socket is guaranteed to be completely released.</div>


<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">That's if I haven't misunderstood something. If this code is correct, either something's happening on my machines that I'm not controlling properly or there's a synchronisation bug in the erlang networking code that I'd like to help identify and solve.</div>

<div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div>

<div dir="ltr">
</div></div><div class="gmail_quote"><div><div>On Thu, Sep 5, 2013 at 1:16 PM, JD Bothma <span dir="ltr"><<a href="mailto:jbothma@gmail.com" target="_blank">jbothma@gmail.com</a>></span> wrote:<br></div></div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div>


<div dir="ltr"><div>Why can this sometimes exit with exception error: no match of right hand side value {error,eaddrinuse} ?</div><div><br></div><div>As far as I know, nothing's connecting to the socket in this time.</div>






<div><br></div>[ begin {ok, LSock} = gen_tcp:listen(12345, [{reuseaddr, true}]),<div>           {error, timeout} = gen_tcp:accept(LSock, 0),</div><div>           ok = gen_tcp:close(LSock)</div><div>   end </div><div>  || _X <- lists:seq(1, 100000) ].<br>






</div><div><br></div><div>This is on R14 and 15 on linux and R16 on OS X.</div><div><br></div><div>BTW it doesn't seem to happen if I don't accept. I'm debugging this behaviour in yaws with SSL but it also seems to happen with plain gen_tcp.</div>





<span><font color="#888888">
<div><br></div><div>JD</div></font></span></div>
<br></div></div>_______________________________________________<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/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div></div>
</blockquote></div></div><br></div></div>
<br>_______________________________________________<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/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>