2013-04-09 66 views
-1

我正在尝试编写一个简单的UDP心跳来广播到我整个子网中给定端口上的所有侦听节点。无法绑定到客户端的广播地址 - Java/Scala

我无法创建/绑定客户端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

这里是我平时使用的代码:

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)); 
    } 
} 
+0

这不是强制性的。 IP将根据到达目的地的路由表选择一个接口。 – EJP 2013-04-09 23:06:40

+0

答复已更新。 – Aubin 2013-04-09 23:12:56

1

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