82 votes

La liaison a échoué : Adresse déjà utilisée

J'essaie de lier une socket à un port ci-dessous :

if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

Mais il donne :

$ ./serve   
Socket created    
bind failed. Error: Address already in use

Pourquoi cette erreur se produit-elle ?

87voto

Joe Points 1932

Tout le monde a raison. Cependant, si vous êtes également occupé à tester votre code, votre propre L'application peut encore "posséder" la prise si elle démarre et s'arrête relativement rapidement. Essayer SO_REUSEADDR en tant qu'option de socket :

Que fait exactement SO_REUSEADDR ?

Cette option de socket indique au noyau que même les l'état TIME_WAIT), il faut quand même le réutiliser. S'il est occupé, mais dans un autre état, vous obtiendrez toujours une erreur d'adresse erreur. C'est utile si votre serveur a été arrêté, puis redémarré juste après. redémarré immédiatement alors que des sockets sont encore actives sur son port. Vous avez Vous devez être conscient que si des données inattendues arrivent, cela peut perturber votre serveur. votre serveur, mais bien que cela soit possible, c'est peu probable.

Il a été souligné qu'"une socket est un tuple de 5 éléments (proto, local local, port local, addr distant, port distant). SO_REUSEADDR indique simplement que vous pouvez réutiliser les adresses locales. Le 5 tuple doit toujours être unique !" par Michael Hunter (mphunter@qnx.com). C'est vrai, et c'est la raison pour laquelle il est c'est pourquoi il est très improbable que des données inattendues soient jamais votre serveur. Le danger est qu'un tel tuple 5 soit encore en train de flotter sur le réseau et que, pendant ce temps, une nouvelle connexion du même du même client, sur le même système, obtienne par hasard le même port distant. Ceci est expliqué par Richard Stevens dans ``2.7 Veuillez expliquer l'état TIME_WAIT. expliquer l'état TIME_WAIT".

57voto

Ed Heal Points 24309

Vous avez un processus qui utilise déjà ce port. netstat -tulpn permet de trouver l'identifiant du processus qui utilise un port particulier.

49voto

Techmonk Points 837

L'erreur signifie généralement que le port que vous essayez d'ouvrir est déjà utilisé par une autre application. Essayez d'utiliser netstat pour voir quels ports sont ouverts et utilisez ensuite un port disponible.

Vérifiez également que vous vous connectez à la bonne adresse IP (je suppose qu'il s'agit de localhost).

49voto

prime Points 1239

Address already in use signifie que le port que vous essayez d'allouer pour votre exécution actuelle est déjà occupée/allouée à un autre processus.

Si vous êtes développeur et que vous travaillez sur une application qui nécessite de nombreux tests, il se peut qu'une instance de cette même application tourne en arrière-plan (peut-être avez-vous oublié de l'arrêter correctement).

Par conséquent, si vous rencontrez cette erreur, il vous suffit de voir quelle application/quel processus utilise le port.

Sous linux, essayez d'utiliser netstat -tulpn . Cette commande permet d'établir une liste de tous les processus en cours.

Vérifier si une application utilise votre port. Si cette application ou ce processus est important, vous pouvez utiliser un autre port qui n'est utilisé par aucun processus/application.

Quoi qu'il en soit, vous pouvez arrêter le processus qui utilise votre port et laisser votre application s'en charger.

Si vous êtes dans un environnement linux, essayez,

  • Utilice netstat -tulpn pour afficher les processus
  • kill <pid> Cette opération met fin au processus

Si vous utilisez Windows,

  • Utilice netstat -a -o -n pour vérifier l'utilisation des ports
  • Utilice taskkill /F /PID <pid> pour tuer ce processus

11voto

Pradheep Points 1315

Comme indiqué ci-dessus, le port est déjà utilisé. Cela peut être dû à plusieurs raisons

  1. une autre application l'utilise déjà.
  2. Le port est en close_wait lorsque votre programme attend que l'autre extrémité ferme le programme. https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state ).
  3. Le programme peut être en time_wait Vous pouvez attendre ou utiliser l'option socket SO_REUSEADDR comme indiqué dans un autre message.

Faire netstat -a | grep <portno> pour vérifier l'état du port.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X