After some experimenting I think I've arrived at a setup that works
Windows -> Windows
Windows -> Linux
Linux -> Windows
Linux -> Linux.
The address that the send socket is bound to is independent of the platform. In all cases it should be bound to the address of the NIC that is being used
The address that the receive socket is bound to depends on the platform.
Under linux etc the recv socket is bound to the broadcast address
Under windows it is bound to the NIC address (same as the send socket).