Je suppose que c'est proche de Linux - Netcat arrête d'écouter le trafic UDP - Super User , mais je pensais que je ferais mieux de demander quand même
En ce qui concerne les versions de netcat, j'utilise Ubuntu 11.04 et la valeur par défaut netcat
, ce qui, je suppose, est celui- openbsd
ci:
$ 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]]
Voici 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'initie une nouvelle connexion client UDP - et je tape hello
trois fois, en appuyant sur ENTRÉE après chaque:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... et revenant au terminal serveur, il a imprimé hello
trois fois, comme prévu:
$ sudo nc -ul 5000
hello
hello
hello
^C
Jusqu'ici tout va bien, tout fonctionne comme prévu. Cependant, disons que j'essaie maintenant la même chose en canalisant l'entrée dans le client; établissez donc d'abord un serveur UDP dans un terminal:
$ sudo nc -ul 5000
... et dans un autre, canalisez certaines données en nc
tant que client UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... après la commande client, le shell se fige comme s'il attendait une entrée - alors là, je tape hello
et ENTRER deux fois de plus; mais le serveur n'a enregistré que le premier hello
(qui a été acheminé via echo
). De plus, même si vous appuyez sur Ctrl-C, et essayer de répéter le client echo hello | nc -u 127.0.0.1 5000
commande, le serveur toujours rester d'avoir rapporté que la première hello
:
$ sudo nc -ul 57130
hello
^C
... et seulement après avoir arrêté le serveur avec Ctrl-C et l'avoir redémarré, on peut répéter la echo hello | nc -u 127.0.0.1 5000
commande client et l'observer fonctionner.
Est-ce ainsi que le nc
comportement est censé se comporter? Je m'attendrais à ce qu'au moins des appels répétés echo hello | nc -u 127.0.0.1 5000
soient enregistrés - sans avoir à redémarrer le serveur? Ou peut-être existe-t-il un commutateur de ligne de commande spécial pour ce type de comportement?
EDIT: J'ai trouvé cette belle présentation PDF: socat - Handling all Sortes of Sockets , qui contient les notes netcat
vs suivantes socat
:
netcat - Limitations
● one-shot seulement (se termine après la fermeture du socket)
...
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
● Serveur TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... cependant, j'obtiens à peu près le même comportement que ci-dessus, si je remplace la commande serveur par " socat - udp4-listen:5000,reuseaddr
" - et la ligne client par " socat - udp:127.0.0.1:5000
" ... Avec l'entrée canalisée, " echo hello | socat - udp:127.0.0.1:5000
", la seule différence est que ici, la commande existe au moins après l' hello
envoi du mot - cependant, encore une fois, des exécutions consécutives de cette commande n'entraîneront aucune réception sur le serveur, jusqu'à ce que le serveur soit redémarré.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), cependant, alors que je vois troishello
s, ce qui me laisse perplexe est toujours présent: cette commande va également trier "verrouiller", comme si vous attendiez une entrée tapée de utilisateur, et après Ctrl-C et le réexécutant, le serveur ne verra aucune donnée jusqu'à ce qu'il soit redémarré!? C'est ce que j'aimerais mieux savoir - cheers!socat
peut fonctionner avec l'fork
option ... Merci encore, bravo!Si vous effectuez une séquence d'écoute nc, cela montrera que netcat attend la connexion, et une fois qu'il l'obtiendra, se connectera à cet hôte et à ce port, ignorant tous les autres. Vous devez ajouter «-k» pour continuer et «-w 0» pour expirer chaque connexion après 0 seconde. Socat est un meilleur choix, je pense.
la source