Ich denke, das ist in der Nähe von Linux - Netcat hört auf, auf UDP-Verkehr zu lauschen - Super User , aber ich dachte, ich frage sowieso besser
In Bezug auf Netcat-Versionen verwende ich Ubuntu 11.04 und die Standardversion netcat
, die ich vermute, ist die folgende openbsd
:
$ 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]]
Das finde ich seltsam: Der erste Fall funktioniert wie erwartet - ich öffne einen UDP-Server in einem Terminal:
$ sudo nc -ul 5000
... und in einem anderen Terminal starte ich eine neue UDP-Client-Verbindung - und hello
tippe dreimal ein, wobei ich jeweils die EINGABETASTE drücke:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... und beim Zurückkehren zum Server-Terminal hello
wurde wie erwartet dreimal gedruckt :
$ sudo nc -ul 5000
hello
hello
hello
^C
Soweit so gut, alles funktioniert wie erwartet. Nehmen wir jedoch an, ich versuche jetzt dasselbe, indem ich Eingaben in den Client leite. So richten Sie zunächst einen UDP-Server in einem Terminal ein:
$ sudo nc -ul 5000
... und in einem anderen leiten Sie einige Daten nc
als UDP-Client ein:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... nach dem Client-Befehl friert die Shell ein, als würde sie auf Eingaben warten hello
. aber der server hat nur den ersten registriert hello
(der via piped wurde echo
). Selbst wenn Sie die Tastenkombination Strg-C drücken und versuchen, den Client- echo hello | nc -u 127.0.0.1 5000
Befehl zu wiederholen , bleibt der Server weiterhin so , dass er nur das allererste gemeldet hat hello
:
$ sudo nc -ul 57130
hello
^C
... und erst nachdem man den Server mit Strg-C gestoppt und neu gestartet hat, kann man den Client- echo hello | nc -u 127.0.0.1 5000
Befehl wiederholen und beobachten, wie er funktioniert.
Soll sich der Weg nc
so verhalten? Ich würde davon ausgehen, dass zumindest wiederholte Anrufe echo hello | nc -u 127.0.0.1 5000
registriert werden - ohne den Server neu starten zu müssen? Oder gibt es einen speziellen Befehlszeilenschalter für diese Art von Verhalten?
BEARBEITEN: Ich fand diese schöne PDF-Präsentation: socat - Umgang mit allen Arten von Steckdosen , die die folgenden netcat
vs socat
Hinweise enthält:
netcat - Einschränkungen
● nur einmalig (wird nach dem Schließen des Sockets beendet)
...
Beispiele 1: netcat-Ersetzung
...
● UDP-Client mit Quellport:
Sockets nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● TCP-Server:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... aber ich bekomme so ziemlich das gleiche Verhalten wie oben, wenn ich den Serverbefehl durch "socat - udp4-listen:5000,reuseaddr
" - und die Client-Zeile durch " socat - udp:127.0.0.1:5000
" ... Bei der Pipe-Eingabe " echo hello | socat - udp:127.0.0.1:5000
" besteht der einzige Unterschied darin, dass Hier ist der Befehl mindestens vorhanden, nachdem das Wort hello
gesendet wurde. Wiederum führen aufeinanderfolgende Ausführungen dieses Befehls zu keinem Empfang auf dem Server, bis der Server neu gestartet wird.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), aber während ich dreihello
s sehe , ist das, was mich verwundert, immer noch vorhanden: Auch dieser Befehl wird sozusagen "sperren", als ob ich auf die Eingabe von wartet Benutzer und nach Strg-C und erneutem Ausführen werden dem Server keine Daten angezeigt, bis er neu gestartet wird !? Das würde ich gerne besser wissen - Prost!