UDPClient未在HTC G2上接收数据包

时间:2012-04-16 18:34:13

标签: xamarin.android

我正试图在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平台的较旧实现上?

2 个答案:

答案 0 :(得分:1)

由于所讨论的UDP响应来自设备上的微控制器而花了一些工作,我想绝对确定它不是微端的问题(尽管我怀疑它不是) 。我为微控制器设备创建了一个基于PC的模拟器,用于处理我的Android UDP请求并发回与微控制器完全相同的UDP响应,然后使用Wireshark验证所有流量都很好。

最终结果是我看到他与模拟器完全相同的行为。 Galaxy Tab 7和10设备接收UDP响应没问题。 HTC G2永远不会。这使我得出以下结论之一:

a)HTC G2特别有一个实施错误,阻止它接收(或至少传递)网络上的UDP广播

b)较旧的Android版本有他的错误。

直到我找到与G2(v2.3)相同Android版本的不同硬件,我才知道是哪种情况。在任何一种情况下,这都是一个错误,使得这个(以及可能的其他)硬件无法用于我的特定解决方案。

答案 1 :(得分:0)

我在市场上有几个基于UDP通信的应用程序。

我遇到HTC手机无法接收其他设备发送的UDP广播数据包的问题...如果从同一台设备发送,则数据包到达。

所以,我认为问题出在HTC上,我在网上找到了一个可能的解决方案(即使我还没试过):

http://www.flattermann.net/2010/09/fix-udp-broadcasts-on-htc-phones-running-stock-firmware/