Saya kira ini dekat dengan linux - Netcat berhenti mendengarkan lalu lintas UDP - Pengguna Super , tapi saya pikir saya lebih baik bertanya
Sejauh versi netcat saya menggunakan Ubuntu 11.04 dan defaultnya netcat
, yang saya duga adalah 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]]
Ini yang saya temukan aneh: case pertama berfungsi seperti yang diharapkan - Saya membuka server UDP dalam satu terminal:
$ sudo nc -ul 5000
... dan di terminal lain saya memulai koneksi klien UDP baru - dan saya mengetik hello
tiga kali, menekan ENTER setelah masing-masing:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... dan kembali ke terminal server, sudah dicetak hello
tiga kali, seperti yang diharapkan:
$ sudo nc -ul 5000
hello
hello
hello
^C
Sejauh ini bagus, semua bekerja seperti yang diharapkan. Namun, katakanlah saya mencoba sekarang sama dengan memasukkan input ke klien; jadi buat dulu server UDP dalam satu terminal:
$ sudo nc -ul 5000
... dan yang lain, menyalurkan beberapa data ke nc
sebagai klien UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... setelah perintah klien, shell akan macet seolah menunggu input - jadi saya ketik hello
dan ENTER dua kali lagi; tetapi server hanya mendaftarkan yang pertama hello
(yang disalurkan melalui echo
). Lebih jauh lagi, bahkan jika Anda menekan Ctrl-C, dan mencoba untuk mengulangi klien echo hello | nc -u 127.0.0.1 5000
perintah, server akan masih tetap memiliki dilaporkan hanya pertama hello
:
$ sudo nc -ul 57130
hello
^C
... dan hanya setelah menghentikan server dengan Ctrl-C dan menyalakannya kembali, seseorang dapat mengulangi echo hello | nc -u 127.0.0.1 5000
perintah klien dan mengamatinya bekerja.
Apakah ini cara nc
yang seharusnya berlaku? Saya berharap bahwa setidaknya panggilan berulang echo hello | nc -u 127.0.0.1 5000
akan didaftarkan - tanpa harus me-restart server? Atau mungkin ada saklar baris perintah khusus untuk perilaku semacam itu?
EDIT: Saya menemukan presentasi PDF yang bagus ini: socat - Menangani semua Jenis Soket , yang berisi catatan netcat
vs berikut socat
:
netcat - Batasan
● satu-shot saja (berakhir setelah soket tutup)
...
Contoh 1: Penggantian netcat
...
● Klien UDP dengan port sumber:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Server TCP:
nc -l -p 8080
socat - tcp-l: 8080, gunakan kembali
...
... Namun, saya cukup banyak mendapatkan perilaku yang sama seperti di atas, jika saya mengganti perintah server dengan " socat - udp4-listen:5000,reuseaddr
" - dan baris klien dengan " socat - udp:127.0.0.1:5000
" ... Dengan input yang disalurkan, " echo hello | socat - udp:127.0.0.1:5000
", satu-satunya perbedaan adalah bahwa di sini perintah paling tidak ada setelah kata hello
dikirim - namun, sekali lagi, berturut-turut menjalankan perintah ini tidak akan menyebabkan penerimaan di server, sampai server dimulai ulang.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), namun, sementara saya melihat tigahello
s, teka-teki apa yang masih ada: perintah itu juga akan mengurutkan "kunci", seolah menunggu input yang diketik dari pengguna, dan setelah Ctrl-C dan memutarnya kembali, server tidak akan melihat data apa pun sampai dimulai ulang !? Itulah yang ingin saya ketahui lebih baik - tepuk tangan!