web-dev-qa-db-fra.com

Comportement NETCAT / SOCAT avec la tuyauterie et UDP?

Je suppose que c'est proche de Linux - Netcat arrête d'écoute pour le trafic UDP - Super utilisateur , mais je pensais que je ferais mieux de demander quand même

Aussi loin que versions de NetCat J'utilise Ubuntu 11.04 et la valeur par défaut netcat dessus, ce que je devine est le openbsd one:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

C'est ce que je trouve étrange: le premier cas fonctionne comme prévu - j'ouvre un serveur UDP dans un terminal:

$ Sudo nc -ul 5000

... et dans un autre terminal, j'en initie une nouvelle connexion client UDP - et je saisis trois fois hello, appuyez sur Entrée après chaque:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... et revenez sur le terminal du serveur, il a imprimé trois fois hello, comme prévu:

$ Sudo nc -ul 5000 
hello
hello
hello
^C

Jusqu'ici tout va bien, tous fonctionne comme prévu. Cependant, disons que j'essaie maintenant de la même chose en passant par la passe au client; Établissez donc d'abord un serveur UDP dans un terminal:

$ Sudo nc -ul 5000

... et dans une autre, pipe quelques données dans nc comme client UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... Après la commande client, la série de coquille se fige comme si vous attendez une entrée - donc là-bas, je tapez hello et entrez deux fois de plus; Mais le serveur n'a enregistré que le premier hello (qui a été canalisé via echo). En outre, même si vous appuyez sur Ctrl-C et essayez de répéter le client echo hello | nc -u 127.0.0.1 5000 commande, le serveur reste reste indiqué juste au tout premier hello:

$ Sudo nc -ul 57130 
hello
^C

... et seulement après avoir arrêté le serveur avec Ctrl-C et le redémarrer à nouveau, peut-on répéter le client echo hello | nc -u 127.0.0.1 5000 commande et observer le fonctionnement.

Est-ce la façon dont nc est censé se comporter? Je m'attendrais à ce que des appels au moins répétés à echo hello | nc -u 127.0.0.1 5000 serait enregistré - sans avoir à redémarrer le serveur? Ou peut-être qu'il y a un commutateur de ligne de commande spécial pour ce type de comportement?

EDIT: J'ai trouvé ce nice PDF Présentation: Traitement de la SOCAT - Manipulation de toutes sortes de sockets , qui contient le netcat vs socat Remarques:

nETCAT - Limitations
[.____] ● un coup d'œil uniquement (se termine la fermeture de la prise de courant)
...
Exemples 1: Remplacement NETCAT
...
[.____] ● Client UDP avec port source:
[.____] NC -U -P 500 1.2.3.4 500
Socat - UDP: 1.2.3.4: 500, SP = 500
● TCP serveur:
[.____] nc -l -p 8080
[.____] Socat - TCP-L: 8080, réutilisation
...

... Cependant, je reçois à peu près le même comportement que ci-dessus, si je remplace la commande serveur avec "socat - udp4-listen:5000,reuseaddr "- et la ligne client avec" socat - udp:127.0.0.1:5000 "... avec l'entrée de la canalisation" echo hello | socat - udp:127.0.0.1:5000 ", la seule différence est que la commande existe ici au moins une fois que le mot hello avait été envoyé - cependant, encore une fois, les exécutions consécutives de cette commande ne causeront aucune réception sur le serveur, jusqu'à ce que le serveur soit redémarré.

16
sdaau

Si vous faites une ronde de NC d'écoute, il montrera que NetCat attend la connexion et une fois qu'il l'obtient, se connectera à cet hôte et à cet orgueil, ignorant tous les autres. Vous devez ajouter '-K' pour continuer et "-W 0 '" pour effectuer chaque connexion après 0 secondes. Socat est un meilleur choix, je pense.

3
pdragon