2012-09-04 23 views
6

khi thiết lập ổ cắm qua dgram.createSocket('udp4'); và KHÔNG gắn nó vào cổng cụ thể Tôi nhận các gói đã phát được gửi đến 255.255.255.255 Nhưng khi tôi ràng buộc cùng một ổ cắm với IP cụ thể của giao diện của tôi this.server.bind(67, host); Tôi sẽ KHÔNG nhận các gói được phát sóng này. Đây có phải là hành vi bình thường không?Nhận các gói được phát sóng khi nghe một cổng cụ thể

Trả lời

4

Các Javadoc for java.net.DatagramSocket nói:

Để nhận được broadcast gói tin một DatagramSocket nên bị trói buộc đến địa chỉ ký tự đại diện. Trong một số triển khai, các gói phát sóng cũng có thể được nhận khi một DatagramSocket bị ràng buộc đến một địa chỉ cụ thể hơn.

Đây là dấu hiệu rõ ràng cho thấy hành vi này phụ thuộc vào nền tảng, vì vậy các ổ cắm Javascript sẽ bị ảnh hưởng theo cùng một cách.

Theo thử nghiệm của tôi, Windows Vista 64 không hoạt động như được mô tả trong câu thứ hai (tức là không nhận được chương trình phát sóng trừ khi bị ràng buộc với INADDR_ANY).

+0

-1 vì câu hỏi này không liên quan gì đến Java. –

+2

@RobRaisch Và một thú vị -1 cho bạn quá.Nếu bạn đã đọc câu trả lời của tôi đúng, bạn sẽ thấy rằng tôi đã trích dẫn Javadoc * làm bằng chứng cho thấy hành vi phụ thuộc vào nền tảng, và do đó nó ảnh hưởng đến Javascript, và thực sự tất cả các ngôn ngữ khác đều nhau. Xấu hổ bạn đã không nhận được nó lần đầu tiên. – EJP

2

Vâng, đây là hành vi do, mà không có một cảng hoặc giao diện, dgram.createSocket() sẽ:

ràng buộc đến địa chỉ "tất cả các giao diện" trên một cổng ngẫu nhiên (nó bên phải điều cho cả udp4 và udp6 socket).

- từ dgram API documentation trên nodejs.org

mà cho phép bạn chụp gói tin broadcast để bất kỳ cổng trên bất kỳ giao diện có sẵn.

Chứng minh cả giao diện và cổng để createSocket() hạn chế bạn chỉ chụp các gói đã được phát tới mạng được liên kết với giao diện được chỉ định trên cổng được chỉ định.

Bạn nên lưu ý rằng để nhận các chương trình phát sóng đến một giao diện cụ thể, chúng sẽ cần được gửi đến địa chỉ quảng bá trên/cho mạng mà giao diện đó phục vụ.

Vì vậy, nếu mạng của bạn là:

10.1.1.0 

với một mặt nạ mạng của:

255.255.255.252 

cũng là:

10.1.1.0/29 (CIDR notation) 

địa chỉ quảng bá đúng là:

10.1.1.7 

Với địa chỉ mạng và mặt nạ mạng của bạn, "Network and IP address calculator" của tuxgraphics.org là một công cụ bạn có thể sử dụng để xác định địa chỉ quảng bá chính xác cho mạng cụ thể của bạn.

+1

Hành vi này phụ thuộc vào nền tảng. Xem ví dụ Stevens, Fenner, & Rudolf, * Lập trình mạng Unix, * Tập I, ấn bản thứ 3, tr. 532, và # 3.3.6 của RFC 1192 mà 'không chịu nổi' về vấn đề này. – EJP

Các vấn đề liên quan