[PATCH 1/2] ws2_32/socket: Do not change the socket address to INADDR_ANY

Michelle van Langen michelvanlangen at gmail.com
Sat Apr 6 18:09:28 CDT 2019


The application I am trying to work iterates over all available network 
addresses and attempts to bind to a port on said address. The line I 
changed rewrites the address to INADDR_ANY and therefore results in a 
double bind. Because of this behaviour the applications never expects to 
have to use SO_REUSEADDR.


I've read deeper into the code of socket.c and found that the function 
interface_bind actually sets SO_REUSEADDR on the socket. While 
setsockopt call is successful, the SO_REUSEADDR is never actually set 
when the address of the socket is INADDR_ANY.

I've tried some small modifications to socket.c to mitigate this, but I 
haven't yet found an elegant solution. And of course, breaking the 
ability to receive broadcast packets is a no-no.

On 06/04/2019 20:16, Erich E. Hoover wrote:
> On Fri, Apr 5, 2019 at 9:27 PM Michel van Langen
> <michelvanlangen at gmail.com> wrote:
>> Changing the socket address causes some applications to attempt to bind
>> the same port twice. These applications enumerate all adapters on the
>> local machine and bind to their unique addresses so they can receive UDP
>> broadcast messages on every connected network.
>>
>> By default, binding to 0.0.0.0:<port> will only bind to the primary
>> adapter of the machine using Windows.
> This won't work, it needs to bind to INADDR_ANY for broadcast packets
> to work properly.  All of the applications that I have encountered
> work just fine with this (they bind to the same port as many times as
> you have local adapters).  Is the application you encountered not
> using SO_REUSEADDR?
>
> Best,
> Erich



More information about the wine-devel mailing list