pvxs icon indicating copy to clipboard operation
pvxs copied to clipboard

server: correctly adjudicate collision bind() of specific port

Open mdavidsaver opened this issue 6 months ago • 7 comments

Attempts to address #81.

On Linux (at least) SO_REUSEADDR, which allows a new listener to bind while an existing sock is in FIN-WAIT. Apparently this allows any number of sockets to bind(), but only when listen() to succeed.

Further, on Linux there is a known documented race condition which can result in all listen() failing. It isn't clear how to handle this case without a potentially infinite loop, so ignore it. If this happens, then eg. no PVA server will get port 5075.

So when probing for another listener, it is necessary to enter the listening state. When this fails, the socket is no longer usable for another bind(), so it is necessary to allocate another for the next attempt.

mdavidsaver avatar Aug 15 '24 01:08 mdavidsaver