This patchset disables most uses of SO_REUSEADDR on Windows and replaces it with calls to the new function socket_set_fast_reuse. On Windows systems the default behaviour is equivalent to SO_REUSEADDR on other operating systems. SO_REUSEADDR can still be set but results in undesired behaviour in most cases. It may even lead to situations were system behaviour is unspecified. More information on this can be found at: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx
I originally encountered this issue when accidentally launching two QEMU instances with identical GDB ports at the same time. In which case QEMU won't fail as one might expect. Note that patch #4 fails checkpatch.pl. This is intentional (see v3 changes). v4 Changes: - Added the silent flag to socket_set_fast_reuse controlling error reporting One location where SO_REUSEADDR was set would report errors if setting the option failed. Keeping the reporting code there would be somewhat unclean, so I moved it to socket_set_fast_reuse. A side effect of this was that the error reporting was added for all locations that now use socket_set_fast_reuse. Here a new flag is added to control error reporting, which means this patchset won't change QEMU behaviour (except for not setting SO_REUSEADDR on Windows). - Fixed a commit message typo - Rebased to current master (2d1fe1873a984d1c2c89ffa3d12949cafc718551). v3 Changes: - Fixed coding style issues. According to checkpatch.pl patch #4 still introduces style errors as tabs are used instead of space for some indentation. I keept the tabs to stay consistent with the sourrounding code, as tabs seem to be used consitently in parts (all?) of the slirp code. - Changed patch #3 to keep SO_REUSEADDR for multicast sockets on windows and added an explainatory comment. - Rebased to current master (94c2b6aff43cdfcfdfb552773a6b6b973a72ef0b). v2 Changes: - Introduce a function with os specific implementation instead of using #ifdef I named it socket_set_fast_reuse instead of the suggested qemu_set_reuseaddr so the name better reflects what the function actually does. gdbstub.c | 6 ++---- include/qemu/sockets.h | 1 + net/socket.c | 18 ++++++++++-------- slirp/misc.c | 3 +-- slirp/socket.c | 4 +--- slirp/tcp_subr.c | 6 ++---- slirp/udp.c | 4 ++-- util/oslib-posix.c | 14 ++++++++++++++ util/oslib-win32.c | 10 ++++++++++ util/qemu-sockets.c | 6 +++--- 10 files changed, 46 insertions(+), 26 deletions(-) util: add socket_set_fast_reuse function which will gdbstub: call socket_set_fast_reuse instead of net: call socket_set_fast_reuse instead of setting slirp: call socket_set_fast_reuse instead of setting util: call socket_set_fast_reuse instead of setting