【发布时间】:2014-05-14 03:10:31
【问题描述】:
我想通过使用网络的广播地址来实现服务发现。我正在使用 WireShark 嗅探数据包,以确认我的 UDP 数据包没有被发送。网络代码未在 UI 线程上运行。 DatagramSocket.send 调用返回,没有抛出异常,但包括 WireShark 在内的其他程序看不到任何异常。我已经验证了getWifiBroadcastAddress返回的地址实际上是我网络的广播地址。
我已经通过编写 C# 程序验证网络支持广播,在另一台机器上运行,并且 WireShark正在检测来自该程序的广播数据包。
这是我的 Android Java 代码:
try {
DatagramSocket socket = new DatagramSocket(Protocol.INQUIRY_PORT);
socket.setBroadcast(true);
InetAddress broadcastAddr = getWifiBroadcastAddress();
byte[] data = new byte[10];
for(int i = 0; i < data.length; i++) {
data[i] = (byte) i;
}
DatagramPacket packet = new DatagramPacket(data, data.length,
broadcastAddr, Protocol.INQUIRY_PORT);
while(true) {
// Loops indefinitely, no errors/exceptions
socket.send(packet);
try {
Thread.sleep(5000);
} catch(InterruptedException ie) {
break;
}
}
} catch(IOException ioe) {
// Not logged
Log.d("Broadcast", "Error sending inquiry.");
}
getWifiBroadcastAddress() 方法如下所示:https://lab.dyne.org/AndroidUDPBroadcast
有谁知道为什么这会默默地失败?就像我说的,我在另一个机器上运行的 C# 程序运行良好,做同样的事情,每 5 秒发送一次相同的数据,WireShark 看到这些数据包,但 Android 手机没有。
【问题讨论】:
-
你在清单中有什么权限?
-
我有 INTERNET、ACCESS_NETWORK_STATE 和 ACCESS_WIFI_STATE。但是如果我没有正确的权限,就会抛出异常,而且没有。
标签: android networking udp