我正在尝试编写一个简单的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
这也给出了同样的例外。我还应该补充一点,我尝试了不同的端口值,并确保机器上没有其他东西正在使用我正在尝试的端口。
答案 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 ));
}
}