Tôi đoán điều này gần với linux - Netcat ngừng lắng nghe lưu lượng UDP - Siêu người dùng , nhưng tôi nghĩ tôi nên hỏi bằng mọi cách
Theo như các phiên bản của netcat tôi đang sử dụng Ubuntu 11.04 và mặc định netcat
trên đó, điều mà tôi đoán là 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]]
Đây là điều tôi thấy lạ: trường hợp đầu tiên hoạt động như mong đợi - Tôi mở máy chủ UDP trong một thiết bị đầu cuối:
$ sudo nc -ul 5000
... và trong một thiết bị đầu cuối khác, tôi khởi tạo kết nối máy khách UDP mới - và tôi nhập hello
ba lần, nhấn ENTER sau mỗi lần:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... và quay trở lại thiết bị đầu cuối máy chủ, nó đã được in hello
ba lần, như mong đợi:
$ sudo nc -ul 5000
hello
hello
hello
^C
Cho đến nay rất tốt, tất cả các công trình như mong đợi. Tuy nhiên, giả sử bây giờ tôi thử tương tự bằng cách chuyển đầu vào vào máy khách; vì vậy hãy thiết lập máy chủ UDP đầu tiên trong một thiết bị đầu cuối:
$ sudo nc -ul 5000
... và trong một trường hợp khác, chuyển một số dữ liệu thành nc
máy khách UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... Sau lệnh máy khách, loại vỏ đóng băng như thể đang chờ đầu vào - vì vậy tôi nhập hello
và ENTER thêm hai lần nữa; nhưng máy chủ chỉ đăng ký đầu tiên hello
(được dẫn qua echo
). Hơn nữa, ngay cả khi bạn nhấn Ctrl-C và cố gắng lặp lại echo hello | nc -u 127.0.0.1 5000
lệnh máy khách , máy chủ vẫn sẽ vẫn báo cáo ngay lần đầu tiên hello
:
$ sudo nc -ul 57130
hello
^C
... và chỉ sau khi dừng máy chủ bằng Ctrl-C và khởi động lại nó, người ta mới có thể lặp lại echo hello | nc -u 127.0.0.1 5000
lệnh máy khách và quan sát nó hoạt động.
Đây có phải là cách nc
được cho là cư xử? Tôi hy vọng rằng ít nhất các cuộc gọi lặp đi lặp lại echo hello | nc -u 127.0.0.1 5000
sẽ được đăng ký - mà không phải khởi động lại máy chủ? Hoặc có thể có một chuyển đổi dòng lệnh đặc biệt cho loại hành vi đó?
EDIT: Tôi tìm thấy trình bày này thoải mái PDF: socat - Xử lý tất cả các loại của Sockets , trong đó có những điều sau netcat
vs socat
ghi chú:
netcat - Hạn chế
● chỉ một lần bắn (chấm dứt sau khi đóng socket)
...
Ví dụ 1: Thay thế netcat
...
● Máy khách UDP có cổng nguồn:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Máy chủ TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... tuy nhiên, tôi gần như nhận được hành vi tương tự như trên, nếu tôi thay thế lệnh máy chủ bằng " socat - udp4-listen:5000,reuseaddr
" - và dòng máy khách bằng " socat - udp:127.0.0.1:5000
" ... Với đầu vào đường ống, " echo hello | socat - udp:127.0.0.1:5000
", sự khác biệt duy nhất là Ở đây, lệnh ít nhất tồn tại sau khi từ hello
đã được gửi - tuy nhiên, một lần nữa, các lần chạy liên tiếp của lệnh này sẽ không gây ra bất kỳ sự tiếp nhận nào tại máy chủ, cho đến khi máy chủ được khởi động lại.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), tuy nhiên, trong khi tôi thấy bahello
giây, câu đố tôi vẫn hiện diện: lệnh đó cũng sẽ sắp xếp "khóa", như thể đang chờ nhập từ người dùng và sau khi Ctrl-C và chạy lại nó, máy chủ sẽ không thấy bất kỳ dữ liệu nào cho đến khi được khởi động lại!? Đó là những gì tôi muốn biết rõ hơn - chúc mừng!