Question FAQ : Que fait exactement « SO_REUSEADDR » ?

Cette option de socket indique au noyau que même si ce port est occupé (dans l’état « TIME_WAIT »), il peut continuer et le réutiliser.
Si il est occupé mais dans un autre état que « TIME_WAIT », l’erreur « address already in use » sera remontée. C’est utile si votre serveur a été arête et redémarré immédiatement alors que des sockets sont toujours actives sur ses ports. Il est possible dans ce cas que des données non attendues continuent d’arriver, ces données pourraient perturber votre serveur mais bien que cela soit possible, c’est tout de même assez rare.
Il faut savoir qu’une socket c’est un 5tuple (protocole, adresse locale, numéro de port local, adresse distante, numéro de port distant). Bien que l’option « SO_REUSEADDR » indique juste que le noyau peut réutiliser l’adresse locale et le numéro de port local, le 5tuple doit tout de même rester unique. C’est pour cela qu’il peut arriver (rarement tout de même) des données non attendues du côté du serveur. Le danger est que le 5tuple est encore « flottant » sur le réseau et tant qu’il est encore dans cet état,, une nouvelle connexion venant de la même adresse distante avec le même numéro de port distant peut survenir.
Ceci est expliqué dans l’entrée FAQ « Expliquez-moi l’état TIME_WAIT ».