Comment créer une connexion TCP en utilisant nc
qui écoute plusieurs hôtes?
nc -l -p 12345
Les connexions simultanées ne sont pas possibles avec netcat
. Vous devez utiliser quelque chose comme ucspi-tcp
outil ou levier tcpserver
xinetd
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é.
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).
-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.
Je recommande socat
comme nc
alternative.
Pour le problème OP, socat - TCP-LISTEN:12345,fork,reuseaddr
peut faire le travail.
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