Comment puis-je m’assurer qu’un socket lié à un port est correctement libéré à la sortie du processus, de sorte que le port puisse être réutilisé sans que bind()
échoue avec EADDRINUSE? J’ai écrit un petit programme qui crée simplement un socket, le lie à un port fixe, attend une connexion et se termine immédiatement. Lorsque je réexécute le programme, l’appel de bind()
échoue avec EADDRINUSE, mais si j’attends quelques minutes, l’opération aboutit.
Existe-t-il un moyen de “dissocier” explicitement le socket, libérant ainsi le numéro de port?
L’utilisation de l’option de socket SO_REUSEADDR vous permettra de redémarrer le programme sans délai.
int iSetOption = 1; ... sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption, sizeof(iSetOption)) ...
La stack TCP / IP garde le port occupé pendant un certain temps même après que close()
– le socket rest à l’état TIME_WAIT
et TIME_WAIT2
.
Si je ne me trompe pas, cela prend généralement 2 minutes, donc si vous devez utiliser le même port, définissez immédiatement l’option SO_REUSEADDR
sur votre socket avant la liaison, comme l’a suggéré Ivo Bosticky.
Pas exactement une réponse à votre question, mais pour être complet:
Sous Windows, vous pouvez définir la valeur de registre TcpTimedWaitDelay pour définir le délai d’expiration de la libération des connexions TCP fermées sur une valeur minimale de 30 secondes.