• # différence d'appel a netcat

    Posté par (site web personnel) . En réponse au message Commande netcat. Évalué à 4.

    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.