Myślę, że jest to bliskie linuxowi - Netcat przestaje nasłuchiwać ruchu UDP - Super Użytkownik , ale pomyślałem, że i tak lepiej zapytam
Jeśli chodzi o wersje netcat , używam Ubuntu 11.04 i domyślnie netcat
na nim, domyślam się 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]]
To wydaje mi się dziwne: pierwszy przypadek działa zgodnie z oczekiwaniami - otwieram serwer UDP w jednym terminalu:
$ sudo nc -ul 5000
... aw innym terminalu inicjuję nowe połączenie klienta UDP - i piszę hello
trzy razy, naciskając po każdym klawisz ENTER:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... i wracając do terminala serwera, wydrukował hello
trzy razy, zgodnie z oczekiwaniami:
$ sudo nc -ul 5000
hello
hello
hello
^C
Jak dotąd tak dobrze, wszystko działa zgodnie z oczekiwaniami. Powiedzmy jednak, że próbuję teraz to samo, przesyłając dane wejściowe do klienta; więc najpierw załóż serwer UDP w jednym terminalu:
$ sudo nc -ul 5000
... a po drugie, potokuj niektóre dane nc
jako klient UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... po komendzie klienta rodzaj powłoki zawiesza się, jakby czekał na dane wejściowe - więc tam wpisuję hello
i ENTER jeszcze dwa razy; ale serwer zarejestrował tylko pierwszy hello
(który został przesłany przez echo
). Co więcej, nawet jeśli naciśniesz Ctrl-C i spróbujesz powtórzyć echo hello | nc -u 127.0.0.1 5000
polecenie klienta , serwer nadal będzie zgłaszał tylko pierwszą hello
:
$ sudo nc -ul 57130
hello
^C
... i tylko po zatrzymaniu serwera za pomocą Ctrl-C i ponownym uruchomieniu go ponownie, można powtórzyć echo hello | nc -u 127.0.0.1 5000
polecenie klienta i obserwować, jak działa.
Czy tak nc
ma się zachowywać? Spodziewałbym się, że przynajmniej powtórzone połączenia echo hello | nc -u 127.0.0.1 5000
zostaną zarejestrowane - bez konieczności ponownego uruchamiania serwera? A może istnieje specjalny przełącznik wiersza polecenia dla tego rodzaju zachowania?
EDYCJA: Znalazłem tę ładną prezentację PDF: socat - Obsługa wszystkich rodzajów gniazd , która zawiera następujące netcat
vs socat
notatki:
netcat - Ograniczenia
● tylko jednorazowy (kończy się po zamknięciu gniazda)
...
Przykłady 1: zamiana netcat
...
● Klient UDP z portem źródłowym:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Serwer TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... jednak uzyskuję to samo zachowanie, co powyżej, jeśli zastąpię polecenie serwera „ socat - udp4-listen:5000,reuseaddr
” - a wiersz klienta „ socat - udp:127.0.0.1:5000
”… W przypadku danych wejściowych potokowych „ echo hello | socat - udp:127.0.0.1:5000
” jedyną różnicą jest to, że tutaj polecenie istnieje przynajmniej po hello
wysłaniu słowa - jednak kolejne uruchomienia tego polecenia nie spowodują żadnego odbioru na serwerze, dopóki serwer nie zostanie zrestartowany.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
”), ale gdy widzę trzyhello
s, to co mnie zastanawia, wciąż jest obecne: to polecenie również będzie jakby „blokować”, jakby czekało na wpisane dane z użytkownika, a po Ctrl-C i ponownym uruchomieniu serwer nie zobaczy żadnych danych, dopóki nie zostanie zrestartowany !? To chciałbym wiedzieć lepiej - na zdrowie!socat
można to obejść zfork
opcją ... Jeszcze raz dziękuję, na zdrowie!Jeśli wykonasz śledzenie nc nasłuchiwania, pokaże, że netcat czeka na połączenie, a gdy je otrzyma, połączy się z tym hostem i portem, ignorując wszystkie inne. Musisz dodać „-k”, aby kontynuować, i „-w 0”, aby przekroczyć limit czasu każdego połączenia po 0 sekundach. Myślę, że Socat to lepszy wybór.
źródło