web-dev-qa-db-fra.com

Bind Failed: adresse déjà utilisée

Je tente de lier un 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 cela donne:

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

Pourquoi cette erreur se produit?

30
TamiL

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, puis utilisez un port disponible.

Vérifiez également si vous vous connectez à la bonne adresse IP (je suppose que ce serait localhost)

22
Techmonk

Tout le monde a raison. Toutefois, si vous êtes également occupé à tester votre code, votre application own peut toujours "posséder" le socket s'il démarre et s'arrête relativement rapidement. Essayez SO_REUSEADDR en tant qu'option de socket:

Que fait exactement SO_REUSEADDR?

Cette option de socket indique au noyau que même si ce port est occupé (dans l’état TIME_WAIT), continuez et réutilisez-le de toute façon. Si c'est occupé, mais avec un autre état, vous obtiendrez toujours une adresse déjà utilisée Erreur. C'est utile si votre serveur a été arrêté, puis redémarré immédiatement alors que les sockets sont toujours actifs sur son port. Vous devrait être conscient du fait que si des données inattendues entrent, cela peut confondre votre serveur, mais bien que cela soit possible, ce n’est pas probable.

"Un socket est un 5 Tuple (proto, adresse locale Addr, port local, adresse distante, port distant). SO_REUSEADDR dit simplement que vous pouvez réutiliser les adresses locales. Le 5 Tuple doit être unique! " par Michael Hunter ([email protected]). Ceci est vrai et ceci C’est pourquoi il est très peu probable que des données inattendues soient visualisées par votre serveur. Le danger est qu’un tel 5 Tuple flotte toujours autour du net, et pendant qu’il rebondit, une nouvelle connexion à partir du même client, sur le même système, arrive à obtenir le même port distant. Ceci est expliqué par Richard Stevens dans `` 2.7 Please expliquer l'état TIME_WAIT. ''.

47
Joe

Vous avez un processus qui utilise déjà ce port. netstat -tulpn permettra à chacun de trouver l'ID de processus utilisant un port particulier.

23
Ed Heal

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

Si vous êtes développeur et que vous travaillez sur une application qui nécessite beaucoup de tests, vous pouvez avoir une instance de votre même application s'exécutant en arrière-plan (vous avez peut-être oublié de l'arrêter correctement)

Donc, si vous rencontrez cette erreur, il suffit de voir quelle application/quel processus utilise le port.

Sous Linux, essayez d'utiliser netstat -tulpn. Cette commande liste une liste de processus avec tous les processus en cours d'exécution. 

Vérifiez si une application utilise votre port.Si cette application ou ce processus est un autre 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 le prendre.

Si vous êtes dans un environnement Linux, essayez,

  • Utilisez netstat -tulpn pour afficher les processus
  • kill <pid> Ceci mettra fin au processus

Si vous utilisez Windows,

  • Utilisez netstat -a -o -n pour vérifier les utilisations du port
  • Utilisez taskkill /F /PID <pid> pour tuer ce processus
4
prime

Je faisais également face à ce problème, mais je l'ai résolu . Assurez-vous que les programmes côté client et côté serveur sont sur projets différents dans votre IDE, dans mon cas, NetBeans. Ensuite, en supposant que vous utilisez localhost, je vous recommande d’implémenter les deux programmes en tant que deux projets différents.

0
AyanG_WAP7