Le close
call marque uniquement le socket TCP fermé. Il n'est plus utilisable par processus. Mais le noyau peut encore contenir certaines ressources pendant un certain temps (TIME_WAIT, 2MLS, etc.).
La définition de SO_REUSEADDR devrait supprimer les problèmes de liaison.
Assurez-vous donc que la valeur de true
est vraiment non nul lors de l'appel de setsockopt
(le bogue de débordement peut l'écraser) :
true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))
Il y a pid
variable est votre code. Si vous utilisez fork
(pour démarrer les processus de gestion des connexions), vous devez fermer sock
également dans le processus qui n'en a pas besoin.
D'abord pour le nommage, donc on nomme tous les mêmes choses de la même manière :
Côté serveur :
Le socket est passé à listen()
puis à accept()
appelons l'écoute socket.Le socket retourné par accept()
appelons le accepté prise.
Côté client :
Le socket est passé à connect()
appelons le connecté/connecté prise.
Concernant votre problème :
Pour terminer le accept()
connexion ed fermer le accepté prise (ce que vous appelez connecté) en utilisant éventuellement d'abord shutdown()
suivi de close ()
.
Pour ensuite accepter une nouvelle boucle de connexion juste avant l'appel au accept()
, ne pas passer par bind()
et listen()
à nouveau.
Uniquement arrêt et fermer l'écoute socket si vous voulez vous débarrasser de en attente connect()
s émis après accept()
retourné.
La connexion est toujours active car vous avez oublié de fermer la prise connectée. La fermeture de la prise d'écoute ne ferme pas automatiquement la prise connectée.
//necessary code
close(connected); // <---- add this line
close(sock);
goto label;
Je ne sais pas pourquoi vous recevez EADDRINUSE. Le code a bien fonctionné sur Linux et mac os.