2012-09-04 116 views
6

當通過dgram.createSocket('udp4');設置套接字並且不將其綁定到特定的端口時我接收的廣播數據包被髮送到255.255.255.255 但是,當我將相同的套接字綁定到我的接口的具體IP this.server.bind(67, host);我不會收到這些廣播的數據包。這是一個正常的行爲?在收聽特定端口時收到廣播的數據包

回答

4

Javadoc for java.net.DatagramSocket說:

爲了接收的廣播包一個DatagramSocket應該綁定 到通配符地址。在一些實現中,當DatagramSocket被綁定到更具體的地址時,也可以接收廣播分組 。

這是一個非常清楚的跡象表明,行爲是平臺相關的,所以Javascript套接字也會受到同樣的折磨。

根據我的測試,Windows Vista 64的行爲不像第二句中所述(即,除非綁定到INADDR_ANY,否則不接收廣播)。

+0

-1因爲這個問題與Java沒有關係。 –

+2

@RobRaisch還有一個快樂-1。如果你已經正確地閱讀了我的答案,那麼你會看到我引用Javadoc *作爲證據表明該行爲是依賴於平臺的*,並且因此它也影響Javascript,並且實際上所有其他語言都是平等的。可惜你第一次沒有得到它。 – EJP

2

是的,這是正常現象,因爲,沒有一個端口或接口,dgram.createSocket()將:

綁定到一個隨機端口上的「全接口」地址(它的權利對於udp4和udp6套接字)。

- 從dgram API documentation上nodejs.org

,讓您捕捉到的廣播數據包到任何端口任何可用的接口上。

將接口和端口都驗證爲createSocket(),只會捕獲已經廣播到綁定到指定端口上指定接口的網絡的數據包。

您應該注意,要接收到特定接口的廣播,他們需要被髮送到該接口所服務的網絡的廣播地址。

所以,如果你的網絡是:

10.1.1.0 

與網絡掩碼:

255.255.255.252 

這也是:

10.1.1.0/29 (CIDR notation) 

正確的廣播地址是:

10.1.1.7 

考慮到您的網絡地址和網絡掩碼,tuxgraphics.org的「Network and IP address calculator」是一種工具,可用於識別特定網絡的正確廣播地址。

+1

該行爲實際上取決於平臺。參見例如Stevens,Fenner,&Rudolf,* Unix Network Programming,* Vol I,3rd edition,p。 532,和RFC 1192的#3.3.6,它在這個問題上「不承認」。 – EJP