netcat en tant que serveur multithread

12

J'utilise netcat pour exécuter un serveur simple comme celui-ci:

while true; do nc -l -p 2468 -e ./my_exe; done

De cette façon, n'importe qui peut se connecter à mon hôte sur le port 2468 et parler avec "my_exe".
Malheureusement, si quelqu'un d'autre veut se connecter pendant une session ouverte, il obtiendrait une erreur "Connexion refusée", car netcat n'est plus en écoute jusqu'à la prochaine boucle "while".

Existe-t-il un moyen de faire en sorte que netcat se comporte comme un serveur multi-thread, c'est-à-dire toujours à l'écoute des connexions entrantes? Sinon, existe-t-il des solutions à cela?

etuardu
la source
Vous pouvez utiliser socat
sivann

Réponses:

18

vous utilisez le mauvais outil pour la tâche: utilisez quelque chose comme ucspi-tcp , en particulier tcpserver :

tcpserver waits for incoming connections and, for each connection, 
runs a program of your choice.
akira
la source
2
Où est-ce que ça a été toute ma vie?!
Sridhar Sarnobat
Merci @akira, pouvez-vous donner l'exemple?
Sabrina
3

Bien que vous n'ayez pas mentionné le système d'exploitation que vous utilisez, je suppose que c'est Linux ou Unix basé sur la syntaxe de votre exemple de commande shell.

Si votre système exécute xinetd (ou son prédécesseur inetd ), vous pouvez utiliser ce logiciel pour écouter une connexion sur le port de votre choix et exécuter un exécutable pour répondre. Avec xinetd / inetd, vous avez la possibilité d'autoriser plusieurs connexions simultanées, chacune desservie par une instance distincte de votre exécutable.

Mox
la source
-2

vous pouvez probablement simplement mettre le processus en arrière-plan (il n'attend pas de retour avant de passer à la boucle suivante) avec un '&' tel que:

while true; do nc -l -p 2468 -e ./my_exe &; done
nairb
la source
7
Cela va engendrer des tas de sous-processus et planter le système ....
jackweirdy
5
Et, seule la première invocation fonctionnera; tous ceux qui réussiront échoueront car il y a déjà un socket serveur sur le port 2468.
Daniel Griscom