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 netcattrê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 helloba 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 helloba 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 ncmá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 hellovà 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 5000lệ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 5000lệ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 5000sẽ đượ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 netcatvs socatghi 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 bahellogiâ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!