On Monday, September 11, 2017 at 11:17:01 PM UTC-4, Dave Cheney wrote: > > The already in use is probably coming from the TCP stack which waits a > certain time before allowing the address to be reused. However I thought > that the net package already used SO_REUSEADDR to avoid the delay in close > to reopen. > > >> The question I'm really asking is not so much how to write code that >> works in practice (or, rather, appears to do so), but how to be certain (on >> the basis of the specification and API documentation) that the code is >> correct. >> > > As written the code is correct. Once the listener is closed, you can > reopen it, modulo TCP stack vagaries. >
The net package is indeed setting SO_REUSEADDR, which allows re-bind on the address immediately after close(2). The problem is that close(2) is not guaranteed to occur as a result of Listener.Close(), because of reference counting of file descriptors. This is not an issue with the TCP stack; the runtime is simply failing to issue the required system call. The original test case: https://gist.github.com/slingamn/f1f2ef4a8d004e67a9b0f27b698a5b13 demonstrates that the use of SO_REUSEADDR allows re-bind to succeed as soon as the close(2) call has been issued (most likely, as James Bardin suggested, at the point when the listener goroutine resumes execution after the interruption of `Accept()`). -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.