0

我正在尝试编写一个简单的 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

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

4

2 回答 2

2

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

于 2013-04-09T22:27:18.347 回答
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 ));
   }
}
于 2013-04-09T18:33:34.433 回答