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 hellotiga kali, menekan ENTER setelah masing-masing:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... dan kembali ke terminal server, sudah dicetak hellotiga 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 ncsebagai 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 hellodan 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 5000perintah, 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 5000perintah klien dan mengamatinya bekerja.
Apakah ini cara ncyang seharusnya berlaku? Saya berharap bahwa setidaknya panggilan berulang echo hello | nc -u 127.0.0.1 5000akan 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 netcatvs 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 hellodikirim - 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 tigahellos, 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!