GNU/Linux >> Tutoriels Linux >  >> Linux

Comment détruire complètement une connexion socket en C

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.


Linux
  1. Comment augmenter le délai d'expiration de la connexion SSH

  2. Comment fermer les ports sous Linux ?

  3. Linux – Comment créer une connexion ad-hoc ?

  4. Comment surveiller une connexion série à 250 000 bauds ?

  5. Comment ajouter une connexion MySQL distante sous Linux ?

Comment forcer Wget à utiliser une connexion IPv4 ou IPv6

Guide pratique :programmation de sockets en Python

Comment fermer rmiregistry en cours d'exécution sur un port particulier?

Comment supprimer une connexion de socket CLOSE_WAIT

Comment fermer ou réinitialiser une connexion pconnect() lors de l'utilisation de PHPRedis et PHP-FPM ?

Comment savoir si une connexion ssh ControlMaster est en cours d'utilisation