2012-07-08 22 views
7

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?

Trả lời

2

Tôi không tin bạn có thể sử dụng netcat theo cách đó. Tôi khuyên bạn nên viết một kịch bản Python đơn giản thực hiện cả nhiệm vụ gửi và nhận trong một tiến trình. Bằng cách đó bạn có thể giữ cổng đó độc quyền và vẫn thực hiện cả hai nhiệm vụ.

9

nc -ul 6666

Nghe tại cổng UDP 6666.

nc -u -p6666 mypinghost.com 4444

Sử dụng UDP port 6666 như là nguồn cổng, gửi tới mypinghost: 4444.

nc: bind thất bại: Địa chỉ đã được sử dụng

Đó sẽ là trên netcat gọi thứ hai, nơi 6666 đã được sử dụng bởi người đầu tiên.

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 mà

đúng.

hoặc có thể netcat đó đang cố gắng liên kết với 6666 để nghe.

chắc chắn đó. Bạn nói với nó để làm điều đó, vì vậy nó đã làm nó.

Điều bạn đang cố gắng làm là không thể giữa hai quy trình trong cùng một máy chủ.Chỉ có một quy trình có thể sử dụng một cổng UDP cục bộ tại một thời điểm, trừ khi bạn sử dụng SO_REUSEADDRESS, mà netcat không xuất hiện để triển khai.

Khi áp phích khác đã đề xuất, giải pháp nằm trong việc sử dụng một quy trình duy nhất.

+0

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

+0

@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

+0

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