Xamarin Forms Artnet和UDP传输

Xamarin Forms Artnet and UDP transmission

我正在创建一个跨平台应用程序,它使用 Artnet 和 UDP 协议与网络上的设备进行通信。 我知道Artnet也是UDP


工作地点:

  1. Windows OS:
  1. Android OS:
  1. iOS:

不明白为什么在Android和iOS上有路由器时通信为0。我尝试了所有可以在网上找到的建议代码,并勾选了我可以找到的 Android 和 iOS 的所有功能。 Wireshark 显示正在传输,但我的应用程序没有捕获数据包。

片段:

var artnet = new ArtNetSocket(); // using System.Net.Sockets;
artnet.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
artnet.Bind(new IPEndPoint(LocalIP, 6454));
artnet.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

EndPoint localPort = new IPEndPoint(IPAddress.Any, Port);
ArtNetData data= new ArtNetData();
artnet.BeginReceiveFrom(recieveState.buffer, 0, recieveState.bufferSize, SocketFlags.None, ref localPort, new AsyncCallback(WhenRecieved), data);


private void WhenRecieved(IAsyncResult state)
{
            //1.Do something when received
            //2.Begin receive again

}

我如何查找 IP:

            NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface Interface in Interfaces)
            {
                if (Interface.NetworkInterfaceType != NetworkInterfaceType.Loopback )
                {

                    UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
                    foreach (var info in UnicastIPInfoCol)
                    {
                        if (info.Address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            IPsets.Add(new IPCouples(info.Address, info.IPv4Mask));
                            
                        }
                    }
                }
            }

这很奇怪,可能很简单...

好的,因为我正在为每个 IP 组创建套接字,所以不会在 public 网络上捕获数据包,除非该应用程序位于 Microsoft OS 设备上。如果我创建一个 UDPClient 并将其绑定到一个端口,而不是本地 IP 地址,它将捕获该端口上的所有内容,而不管发件人的 IP 地址。如果检查套接字的 IP 地址,它将是 0.0.0.0:PortNumber.

    public class Something: UdpClient
    {
       public int LocalPort;
       public Something(int LocalPort) : base(LocalPort)
        {

            EnableBroadcast = true;
            this.LocalPort = LocalPort;
            StartListening();
        }

        private void StartListening()
        {
            //IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
            
            try
            {

                StateObject state = new StateObject();
                state.workSocket = Client;
                BeginReceive(received, state);
                
            }
            catch (SocketException e)
            {
                Console.WriteLine(e);
            }
        }

        private void received(IAsyncResult ar)
        {
            
            IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
            StateObject state = (StateObject)ar.AsyncState;

            var message = EndReceive(ar, ref remoteEndPoint);

            if (message.Length > 0)
            { 
                var messageString = (Encoding.UTF8.GetString(message));
                    
                //Do Something
            }
            StartListening();



        }

        public SendToAll(string message)
        {
         var callMessage = Encoding.ASCII.GetBytes(message);
                        UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
                        foreach (UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol)
                        {
                            if (UnicatIPInfo.Address.AddressFamily == AddressFamily.InterNetwork)
                            {

                                EnableBroadcast = true;
                                Send(callMessage, callMessage.Length, new IPEndPoint(GetBroadcast(UnicatIPInfo.Address,UnicatIPInfo.IPv4Mask) , LocalPort));

                            }
                        }
      }

      private IPAddress GetBroadcast(IPAddress someAddress, IPAddress someMask)
      {                

           //Do something to get broadscat
           return Broadcast;
      }


}
    public class StateObject
    { 
        public Socket workSocket = null;
        public const int BufferSize = 256;
        public byte[] buffer = new byte[BufferSize];
        public StringBuilder sb = new StringBuilder();
    }

它适用于所有平台。小心你使用的端口。