【问题标题】:udpClient.Receive doesn't receive any UDP datagram under MonoDroid + Simulator [duplicate]udpClient.Receive 在 MonoDroid + Simulator 下没有收到任何 UDP 数据报 [重复]
【发布时间】:2011-09-13 12:05:18
【问题描述】:

使用以下代码,我在 MonoDroid + Simulator 下没有收到任何 UDP 数据报。但是同样的代码在 MonoTouch 下运行良好...

好的,我知道无法保证同一段代码在不同平台上的工作方式相似。但归根结底,这是我在 iOS 和 Android 上使用 C# 所期望的。

 System.Threading.Thread udpListener = new System.Threading.Thread(() =>
 {
   System.Net.Sockets.UdpClient udpClient = new System.Net.Sockets.UdpClient(UDP_PORT);
   while (true)
   {
     try
     {
       System.Net.IPEndPoint sender = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
       byte[] bytes = udpClient.Receive(ref sender);
       using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes))
       {
         System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyMessageList));
         MyMessageList messages = serializer.Deserialize(ms) as MyMessageList;
         if (messages != null) ParseNotificationMessages(messages);
       }
     }
     catch (System.Exception exp)
     {
     }
   }
 });
 udpListener.IsBackground = true;
 udpListener.Start();

干杯,帕特里克

【问题讨论】:

    标签: c# mono xamarin.ios xamarin.android udpclient


    【解决方案1】:

    奇数; UDP 应该工作,因为这是我们的测试之一:

    int Port = 9595;
    
    var server = new UdpClient(Port);
    server.BeginReceive(result => {
            IPEndPoint sender = null;
            var data = server.EndReceive(result, ref sender);
            var value = Encoding.Unicode.GetString (data);
            if (value != "hello there!")
                throw new InvalidOperationException ("UDP data transfer failed!");
            RunOnUiThread (() => textview.Text += "\n\nRead data from UDP: " + value);
            server.Close ();
    }, null);
    
    using (var client = new UdpClient()) {
        var bytes = Encoding.Unicode.GetBytes("hello there!");
        client.Send(
            bytes,
            bytes.Length,
            new IPEndPoint(IPAddress.Loopback, Port));
    }
    

    现在,上面的代码使用回送设备而不是“真实”设备,但我希望/期望它能够工作......

    您要从哪个端口读取? Android 确实使用 Linux 内核,因此对小于 1024 的端口的访问仅限于授权用户。

    另一种可能是您缺少android.permission.INTERNET 权限,这是所有网络相关操作所必需的。

    【讨论】:

    • 感谢您的帮助
    • 我测试了上面的代码,但问题依旧。并且在环回模式模拟器到模拟器中是可以的。但是,一旦我在我的桌面和 Android 模拟器之间进行检查,我在“数据”中什么也得不到。
    • ...嗯,回车键...我确认我的 INTERNET 标志已设置。 (而且 WCF 通信没问题。)
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 2016-06-20
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多