Libération des ports liés à la sortie du processus

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.