Tôi đang cố sử dụng netcat để mô phỏng giao thức truyền tải NAT.Sử dụng netcat để gửi gói UDP mà không cần ràng buộc
Tôi có một trường hợp được lắng nghe các gói tin UDP trên cổng 6666, như vậy:
nc -ul 6666
Trong một cửa sổ terminal, tôi đang cố gắng định kỳ gửi một gói tin UDP từ cổng 6666 (để mở con đường trở lại trên router. đây sẽ là trong một kịch bản lặp lại mỗi 20 giây để mở lại cảng)
nc -u -p6666 mypinghost.com 4444
vấn đề là netcat thất bại trong cuộc gọi ping này với tin nhắn:
nc: bind thất bại: Địa chỉ đã được sử dụng
nào ngụ ý rằng người nghe đã bị ràng buộc vào cổng 6666 là ngăn chặn quá trình khác gửi từ cổng đó, hoặc có thể netcat đang cố gắng bám vào 6666 để lắng nghe.
Đây có phải là cách netcat được viết hay tôi có thể sử dụng một cách nào đó để cho phép tôi gửi gói mà không cần phải kết nối với cổng để nghe?
Tôi gặp sự cố tương tự này và tôi đã đoán rằng SO_REUSEADDRESS tránh lỗi đó. Nhưng sau đó các thông điệp trả về không được nhận bởi quá trình lắng nghe - trừ khi tôi bắt đầu nó sau khi quá trình gửi liên kết với cổng. Sự hiểu biết của tôi là tùy chọn được sử dụng cho "multicast" (mà tôi không nghĩ là trường hợp của tôi), nhưng có cách để sử dụng nó để các tin nhắn được gửi đến cổng 6666 đi đến quá trình muốn nhận chúng, thay vì quá trình gần đây nhất để ràng buộc cổng? – Edmund
@Edmund Các tin nhắn nên đi đến tất cả các quá trình nhận được từ cổng đó. – EJP
Bởi "quá trình nhận được", bạn có nghĩa là những người đang bị ràng buộc với nó, hoặc những người gọi là 'recvfrom'? Như nó xảy ra, UDP datagrams dường như được chọn một cách đáng tin cậy chỉ bởi quá trình gần đây nhất để ràng buộc. Ngay cả khi quá trình đó không bao giờ gọi là 'recvfrom', nó vẫn ngăn người kia nhận bất cứ thứ gì. Nhưng cuộc thảo luận bình luận này đang trở nên đông đúc nên tôi sẽ hỏi một câu hỏi riêng và bao gồm mã của tôi, trừ khi bạn có thể nghĩ ra một điều đơn giản mà tôi có thể đang bỏ lỡ. ;-) – Edmund