web-dev-qa-db-fra.com

Comment écouter plusieurs connexions TCP à l'aide de NC

Comment créer une connexion TCP en utilisant nc qui écoute plusieurs hôtes?

nc -l -p 12345
23
Aman Jain

Les connexions simultanées ne sont pas possibles avec netcat. Vous devez utiliser quelque chose comme ucspi-tcp outil ou levier tcpserverxinetd puisque vous êtes sous Linux.

Voir: https://superuser.com/questions/232747/netcat-as-a-multithread-server

Les connexions consécutives peuvent être gérées via un script Shell qui redémarre netcat une fois terminé.

16
Hans Z.

ncat peut le faire.

Par exemple. ncat --broker --listen -p 12345 distribuera tous les messages entrants à tous les autres clients (pensez-y comme un hub).

12
masterxilo

-k
Force nc à rester à l'écoute d'une autre connexion une fois sa connexion actuelle établie. C'est une erreur d'utiliser cette option sans l'option -l.

8
excitoon

Je recommande socat comme nc alternative.

Pour le problème OP, socat - TCP-LISTEN:12345,fork,reuseaddr peut faire le travail.

8
dyng

Ceci est une réponse incomplète, car je ne l'ai pas fait fonctionner. Sans doute plus d'une question, en fait. Peut-être que quelqu'un d'autre peut le terminer.

Tout d'abord, il semble qu'il existe différentes versions de netcat. Je suis sur Ubuntu, j'ai donc probablement la version fournie avec Ubuntu. Quand je nc -h, il dit ceci:

OpenBSD netcat (Debian patchlevel 1.187-1ubuntu0.1)

Quand je lance man nc, il dit ceci:

-F      Pass the first connected socket using sendmsg(2) to stdout and exit.  This
        is useful in conjunction with -X to have nc perform connection setup with
        a proxy but then leave the rest of the connection to another program (e.g.
        ssh(1) using the ssh_config(5) ProxyUseFdpass option).

Il me semble que cela signifie qu'au lieu de faire la chose habituelle avec stdin et stdout, il imprime simplement quelque chose sur stdout. Ce quelque chose pourrait ensuite être utilisé par un autre processus pour établir la connexion réelle avec le client.

Malheureusement, -F n'a aucun effet que je puisse voir. Alors peut-être que je me trompe. Ou peut-être qu'il y a quelque part une pipe secrète que je dois écouter, ou un argument supplémentaire qu'ils ont oublié de documenter. Ou peut-être que j'ai une version cassée de netcat, et cela fonctionne pour tous les autres utilisateurs d'Ubuntu.

En combinaison avec le -k option (ou, à défaut, une boucle while-true), cela permettrait à de nombreux clients différents d'avoir des connexions distinctes. Supposons que vous ayez un exécutable appelé handle_connection, qui prend comme arguments un descripteur de fichier d'entrée d'un client et un descripteur de fichier de sortie pour le client, et génère un sous-processus qui communique avec le client. Le script du serveur pourrait alors ressembler à ceci:

nc -lkF $Host $port | while read in out ; do
    handle_connection $in $out ;
done
0
David Knipe