Un petit coup de ltrace pour confirmer ce que je pensais.
TL;DR: netcat -p 2345 -l crée une socket serveur alors que netcat localhost 2345 crée une socket cliente
Quand tu fais un netcat -p 2345 -l tu crée une socket d'écoute qui se connecte (bind) au port 2345.
Un seul processus peut se connecter a un port. Donc quand tu relance un notre netcat -p 2345 -l, le deuxième processus te renvoie une erreur car il ne peut binder sur la même adresse.
Les étapes suivantes d'une connexion sont listen et accept
Avec listen le processus serveur signale au noyau que le processus serveur est à l'écoute des connexions entrantes.
Cependant il n'est pas prêt a traiter une connexion. Pour cela il doit faire un accept qui bloquera jusqu'à ce qu'une connexion cliente arrive sur l'ordinateur.
Maintenant le processus serveur est bloqué.
C'est là que netcat localhost 2345 intervient. Il s'agit d'un processus client, c'est beaucoup plus simple.
La seule chose que le client fait c'est un connect a l'adresse (localhost) et au port (2345) du serveur.
Maintenant le serveur est prêt a être débloqué.
accept renvoie une socket de connexion (différente de la socket d'écoute).
connect coté client à son tour renvoie une socket de connexion.
En règle générale, à ce stade un processus serveur fera un autre accept pour accueillir un nouveau client. Mais netcat ne gère qu'un seul client à la fois.
Donc maintenant le processus serveur close la socket d'écoute.
A ce stade le client et le serveur peuvent faire des read et des write sur les socket de connexion jusqu'à ce que l'un d'entre eux close la connexion.
Mais maintenant la socket d'écoute est fermée
donc plus rien ne bind sur le port 2345
donc un autre serveur peut a son tour binder dessus. Et c'est pour quoi dans le premier cas tu as une erreur et pas dans le second.
# différence d'appel a netcat
Posté par Xavier Combelle (site web personnel) . En réponse au message Commande netcat. Évalué à 4.
Un petit coup de
ltracepour confirmer ce que je pensais.TL;DR:
netcat -p 2345 -lcrée une socket serveur alors quenetcat localhost 2345crée une socket clienteQuand tu fais un
netcat -p 2345 -ltu crée une socket d'écoute qui se connecte (bind) au port 2345.Un seul processus peut se connecter a un port. Donc quand tu relance un notre
netcat -p 2345 -l, le deuxième processus te renvoie une erreur car il ne peut binder sur la même adresse.Les étapes suivantes d'une connexion sont
listenetacceptAvec
listenle processus serveur signale au noyau que le processus serveur est à l'écoute des connexions entrantes.Cependant il n'est pas prêt a traiter une connexion. Pour cela il doit faire un
acceptqui bloquera jusqu'à ce qu'une connexion cliente arrive sur l'ordinateur.Maintenant le processus serveur est bloqué.
C'est là que
netcat localhost 2345intervient. Il s'agit d'un processus client, c'est beaucoup plus simple.La seule chose que le client fait c'est un
connecta l'adresse (localhost) et au port (2345) du serveur.Maintenant le serveur est prêt a être débloqué.
acceptrenvoie une socket de connexion (différente de la socket d'écoute).connectcoté client à son tour renvoie une socket de connexion.En règle générale, à ce stade un processus serveur fera un autre
acceptpour accueillir un nouveau client. Mais netcat ne gère qu'un seul client à la fois.Donc maintenant le processus serveur
closela socket d'écoute.A ce stade le client et le serveur peuvent faire des
readet deswritesur les socket de connexion jusqu'à ce que l'un d'entre euxclosela connexion.Mais maintenant la socket d'écoute est fermée
donc plus rien ne bind sur le port 2345
donc un autre serveur peut a son tour binder dessus. Et c'est pour quoi dans le premier cas tu as une erreur et pas dans le second.