我正在尝试在 Mono for Android 下接收 UDP 广播,但没有看到数据进入。这有点令人困惑,因为它在我拥有的 Galaxy Tab 7 和 Galaxy Tab 10 (Android v 3.2) 上运行良好,但在HTC G2 (Android v2.3.4)。
代码很简单:
public void BeginDiscover()
{
var packet = new DiscoverPacket();
lock (m_syncRoot)
{
var localEndpoint = new IPEndPoint(m_local, 0);
using (var udp = new UdpClient(localEndpoint))
{
var remoteEndpoint = new IPEndPoint(IPAddress.Broadcast, DiscoverPort);
udp.Send(packet.Data, packet.Data.Length, remoteEndpoint);
Thread.Sleep(100);
}
}
}
我已验证清单包含以下行:
<uses-permission android:name="android.permission.INTERNET" />
尽管这发生在 Debug 中,但无论如何都应该隐式设置。
其他非常奇怪的观察:
- 同样,这在另一种类型的设备上工作得很好
- 监听 UDP 广播的处理程序(监听响应的列表)确实看到了这个出站数据包。这个监听器的代码也很简单:
[监听代码]
private void Start()
{
m_discoverListener = new UdpClient(DiscoverPort);
m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener);
}
private void DiscoverCallback(IAsyncResult result)
{
try
{
var ep = new IPEndPoint(IPAddress.Any, DiscoverPort);
var data = m_discoverListener.EndReceive(result, ref ep);
// filter out what we send
var add = AddressWithoutPort(ep.Address);
if (add == m_local.ToString()) return;
// parse discover response
// [clipped for clarity]
}
finally
{
m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener);
}
}
- 在同一网络上的另一台 PC 上运行的 Wireshark确实看到了发现请求数据包(来自上方)
- “发现”的设备也看到了它,因为 Wireshark 也看到了回复
- Android 设备 UDP 侦听器未收到响应数据包
我能想到的设备之间的唯一主要区别(除了实现该平台的不同 OEM 之外)是 G2 内置了蜂窝无线电,而 Galaxy Tab 没有。但是,在我的特定测试案例中,我的手机中没有 SIM 卡,因此没有建立蜂窝连接。请注意,上面的代码明确使用 WiFi 网络上的本地端点。
G2 上的 UDP 是否存在已知问题,特别是或一般在 Android 平台的较旧实现上?