2013-04-25 460 views
13

如果我们想从套接字广播信息,我们需要启用SocketOptions.SO_BROADCAST。但是,我不明白为什么这是必要的。为什么我们需要SocketOptions.SO_BROADCAST来启用广播?

我的理解是我们使用广播地址设置数据包,就像设置单播地址一样。然后我们只需要通过一个普通的套接字发送它。如果它是一个UDP套接字,那么UDP头将被添加到该包中,然后包含接收者IP地址的IP头(在这种情况下是广播地址,形式为192.168.255.255),然后添加一个MAC地址(FF:FF:FF:FF)

我认为路由器会得到数据包并执行广播。我不明白为什么我们需要将套接字属性设置为SO_BROADCAST

+1

在大多数情况下,这些电话只需要调用在OS同样的事情。这可能是您的操作系统的限制,而不是Java。 – 2013-04-25 14:49:32

+1

你应该把它作为一个答案@PeterLawrey – Fildor 2013-04-25 14:59:22

回答

16

“套接字语义要求应用程序在尝试将数据报发送到基地址或广播地址之前设置SO_BROADCAST选项,这可以防止应用程序意外地将数据报发送到多个系统。

Source

+0

非常感谢。我想这适用于Linux和Windows以及 – henryyao 2013-04-25 15:23:15

+0

源链接已损坏:( – 2016-07-26 16:13:43

+0

我已经修复了它。 – 2016-07-26 17:09:50

2

在大多数情况下,这些调用只是在OS中调用相同的东西。这可能是您的操作系统的限制,而不是Java。

+0

好吧,但进一步的问题是为什么Linux需要这样做?同样的东西似乎也用在窗户以及 – henryyao 2013-04-25 15:09:38