无法绑定到客户端中的广播地址 - Java / Scala

时间:2013-04-09 18:26:50

标签: java sockets networking udp bind

我正在尝试编写一个简单的UDP心跳来广播到整个子网中给定端口上的所有侦听节点。

我在创建/绑定客户端DatagramSocket时遇到问题。我正在尝试这样的代码:

// My IP is 192.168.201.57, so I'm using 192.168.201.255 for broadcast.  Right?
val socket = new DatagramSocket(9099, InetAddress.getByName("192.168.201.255"))

这产生了一个异常:java.net.BindException:无法分配请求的地址。

我也尝试过255.255.255.255,结果相同。 也根据我在另一篇文章中读到的内容尝试了类似的东西:

val socket = new DatagramSocket(null)
socket.bind( new InetSocketAddress(broadcastIp, port) )  // where I tried several broadcastIp values

这也给出了同样的例外。我还应该补充一点,我尝试了不同的端口值,并确保机器上没有其他东西正在使用我正在尝试的端口。

2 个答案:

答案 0 :(得分:2)

您无法绑定到广播地址。这个问题没有意义。您根本不需要绑定进行发送,而在接收时,您应该在大多数情况下绑定到0.0.0.0。

答案 1 :(得分:0)

以下是我经常使用的代码:

public static final String HOST_DST = "148.140.60.29";
public static final int    PORT_DST = 2416;
public static final int    PORT_SRC = 2802;

void method() {
   DatagramSocket    sock    = new DatagramSocket( PORT_SRC );
   InetSocketAddress dst     = new InetSocketAddress( HOST_DST, PORT_DST );
   ByteBuffer        message = ByteBuffer.allocate( MESSAGE_SIZE );
   for(...) {
      message.clear();
      message.putFloat( ... );
      message.putInt( ... );
      ...
      message.flip();
      sock.send( new DatagramPacket( message.array(), message.limit(), dst ));
   }
}