On 09/10/2013 07:26 AM, Sebastian Ottlik wrote: > If a socket is closed it remains in TIME_WAIT state for some time. On > operating > systems using BSD sockets the endpoint of the socket may not be reused while > in > this state unless SO_REUSEADDR was set on the socket. On windows on the other > hand the default behaviour is to allow reuse (i.e. identical to SO_REUSEADDR > on > other operating systems) and setting SO_REUSEADDR on a socket allows it to be > bound to a endpoint even if the endpoint is already used by another socket > independently of the other sockets state. This can even result in undefined > behaviour. > > Many sockets used by QEMU should not block the use of their endpoint after > being > closed while they are still in TIME_WAIT state. Currently QEMU sets > SO_REUSEADDR > for such sockets, which can lead to problems on Windows. This patch introduces > the function socket_set_fast_reuse that should be used instead of setting > SO_REUSEADDR and does the right thing on all operating systems. > > Signed-off-by: Sebastian Ottlik <ott...@fzi.de> > ---
> +int socket_set_fast_reuse(int fd) > +{ > + int val = 1, ret; > + > + ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, > + (const char *)&val, sizeof(val)); > + > + if (ret < 0) { > + perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)"); > + } This would be the first use of perror in this file; I'm not sure if that is the right function, or if there is a better thing to be using (in fact, returning -1 and letting the client decide whether to issue a warning may even be better). -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature