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!socat
bisa mengatasinya denganfork
opsi ... Terima kasih lagi, tepuk tangan!Jika Anda melakukan strace dari nc yang mendengarkan, itu akan menunjukkan bahwa netcat sedang menunggu koneksi, dan setelah mendapatkannya, akan terhubung ke host dan port tersebut, mengabaikan semua yang lain. Anda perlu menambahkan '-k' untuk terus berjalan dan '-w 0' ke waktu habis setiap koneksi setelah 0 detik. Socat adalah pilihan yang lebih baik, saya pikir.
sumber