Vapor : Thread 1: Fatal error: ): Address already in use (errno: 48)

Depuis ce samedi Vapor me délivre ce message d’erreur
Thread 1: Fatal error: Error raised at top level: bind(descriptor:ptr:bytes:): Address already in use (errno: 48).
Xcode 12.1, dernière version de Vapor (4.34, mais aussi le cas avec la 4.32), Fluent avec SQLite.
Message généré au lancement du serveur, mais seulement au second lancement. Essais sur un portable et un iMac, même résultat. Peu d’infos sur Internet et très vieilles.
Si on redémarre la machine, le serveur redémarrera bien. Mais si on stoppe et on redémarre, de nouveau le message.
Merci pour toute information.

@jldubien c’est un problème avec Xcode 12, le processus d’arrêt ne coupe pas le port utilisé, donc tu as une erreur, car l’adresse est déjà utilisée.

Il y en a qui pense que ça arrive quand on utilise un projet Xcode compilé.

D’autres proposent de mettre dans main.swift, la ligne suivante :

defer { app.shutdown() }

Personnellement, dans le fichier main.swift, j’ai ça :

import App

import Vapor

var env = try Environment.detect()

try LoggingSystem.bootstrap(from: &env)

let app = Application(env)

defer { app.shutdown() }

try configure(app)

try app.run()

En espérant t’avoir aidé

Merci pour la réponse. J’avais en effet cette idée de processus qui ne se termine pas. A tout hasard j’ai installé en plus de la version 12.1, la version 11.7 de Xcode et j’obtiens le même résultat. Est-ce que cela peut être normal via le fait que les 2 Xcode sont installés ou bien est-ce que la mise à jour 10.15.7 de Catalina ne serait pas en cause. Pour le fichier «main.swift», il est aussi OK pour moi mais le problème subsiste donc. Un essai avec Xcode 12.2 beta 3 serait-il une solution ?
Espérons une solution rapide car le développement avec Vapor devient plus que compliqué.
Merci encore.
On va quand même terminer le cours de Maxime, au moins en théorie !

Il existe en fait une solution qui avait été publié en 2018 pour le problème similaire. Dès que l’on lance le web service, un processus d’écoute est créé. Pour le visualiser il faut saisir la commande «lsof -i :8080» au niveau du terminal, et c’est ce processus qui ne veut pas disparaître quand on stoppe le web service au niveau de Xcode (version 12.1).
Exemple :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Run 991 jldubien 8u IPv4 0xd9b7f91b8d4595a1 0t0 TCP localhost:http-alt (LISTEN)

Pour supprimer ce process, il suffit depuis le terminal de saisir la commande kill suivi du PID, dans cet exemple PID = 991.
Dès lors on peut relancer le web service depuis Xcode. Et de plus c’est magique, car il ne devient plus nécessaire de passer par le terminal, on peut stopper, redémarrer, stopper, etc.

3 « J'aime »

Merci beaucoup pour ta solution :+1:

Ça ne marche pas vraiment aujourd’hui, ton truc. Je suis sur Big Sur version 11.1, Xcode 12.3, et si je suis ton astuce, dès que j’envoie le kill, j’ai un plantage de vapor :
let err = pthread_cond_wait( self .cond, self .mutex.mutex)

precondition(err == 0, « ( #function ) failed in pthread_cond with error (err) »)

Je reste donc avec mon Address already in use (errno: 48) et j’avoue que je ne sais que faire.

Si, ça marche… à condition de ne pas recompiler, car alors il faut tout reprendre, lsof, kill avant de tester une requête. Pas Glop.