public RemotePacket Invoke()
        {
            var length = _socket.StrictField.Default.ReceiveFrom(_buffer.Value, out var address);

            var stream = new MemoryStream(_buffer.Value, 0, length, false);
            var sender = stream.ReadEnd();

            if (sender == (_name.Field?.Field ?? ""))
            {
                return(null);
            }

            // 尝试打开数据到来的网络
            _monitor.Field?.OpenWhere(pair => Match(pair.Value, address));
            // 更新成员IP地址
            _addresses.Field?.Update(sender, address);

            // 解包
            var packet = new RemotePacket(sender, (byte)stream.ReadByte(), stream.ReadRest());

            // Console.WriteLine($"{packet} from {address}");

            foreach (
                var listener
                in from item in _listeners
                where !item.Interest.Any() || item.Interest.Contains(packet.Command)
                select item
                )
            {
                listener.Process(packet);
            }

            return(packet);
        }
예제 #2
0
        public void Process(RemotePacket remotePacket)
        {
            var(sender, _, payload) = remotePacket;

            if (!string.IsNullOrWhiteSpace(remotePacket.Sender))
            {
                _addresses
                .StrictField
                .Update(sender, (payload[0] << 8) | payload[1]);
            }
        }
        public void Process(RemotePacket remotePacket)
        {
            if (remotePacket.Payload.Length == 0 ||
                remotePacket.Payload.GetString() != _name.StrictField.Field)
            {
                return;
            }

            var port = _servers.StrictField
                       .Default
                       .LocalEndpoint
                       .Let(it => (IPEndPoint)it)
                       .Port
                       .Let(it => new[] { (byte)(it >> 8), (byte)it });

            _broadcaster.StrictField.Broadcast((byte)UdpCmd.AddressAck, port);
        }
예제 #4
0
        void DataReceived(byte[] data)
        {
            RemotePacket packet = Deserialize <RemotePacket>(data);

            if (packet != null)
            {
                switch (packet.Action)
                {
                case RemoteServerAction.GetScreen:
                    if (packet.DataType == typeof(Bitmap) && DesktopReceived != null)
                    {
                        DesktopReceived(this, this.Deserialize <Bitmap>(packet.Data));
                    }
                    break;
                }
            }
        }
예제 #5
0
        public void Process(RemotePacket remotePacket)
        {
            var(name, cmd, _) = remotePacket;

            if (!string.IsNullOrWhiteSpace(name))             // 非匿名则保存名字
            {
                if (!_group.StrictField
                    .Update(name, DateTime.Now, out var previous) ||
                    DateTime.Now - previous > _timeout)
                {
                    _detected?.Invoke(name);
                }
            }

            if (cmd == (byte)UdpCmd.YellAsk)              // 回应询问
            {
                _broadcaster.Field?.Broadcast((byte)UdpCmd.YellAck);
            }
        }
예제 #6
0
        public void Process(RemotePacket remotePacket)
        {
            var(sender, _, payload) = remotePacket;
            var stream = new MemoryStream(payload);
            var topic  = stream.ReadEnd();
            var type   = (GraphType)stream.ReadByte();

            Ports.GetOrAdd(new TopicConfig(sender, topic, type),
                           new Port(null))
            ?.Also(port => {
                var rest  = stream.Length - stream.Position;
                var data  = new NetworkDataReader(stream);
                var frame = new List <Vector3>();
                switch (type)
                {
                case GraphType.OneDimension:
                    switch (rest)
                    {
                    case sizeof(float):
                        frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                              data.ReadFloat(),
                                              float.NaN));
                        break;

                    case sizeof(double):
                        frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                              (float)data.ReadDouble(),
                                              float.NaN));
                        break;
                    }

                    break;

                case GraphType.TwoDimension:
                    switch (rest)
                    {
                    case 2 * sizeof(float):
                        frame.Add(new Vector3(data.ReadFloat(),
                                              data.ReadFloat(),
                                              float.NaN));
                        break;

                    case 2 * sizeof(double):
                        frame.Add(new Vector3((float)data.ReadDouble(),
                                              (float)data.ReadDouble(),
                                              float.NaN));
                        break;
                    }

                    break;

                case GraphType.Pose:
                    switch (rest)
                    {
                    case 3 * sizeof(float):
                        frame.Add(new Vector3(data.ReadFloat(),
                                              data.ReadFloat(),
                                              data.ReadFloat()));
                        break;

                    case 3 * sizeof(double):
                        frame.Add(new Vector3((float)data.ReadDouble(),
                                              (float)data.ReadDouble(),
                                              (float)data.ReadDouble()));
                        break;
                    }

                    break;

                case GraphType.Frame:
                    var length = rest - 1;
                    switch ((FrameType)stream.ReadByte())
                    {
                    case FrameType.OneFloat:
                        length /= sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                                  data.ReadFloat(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.OneDouble:
                        length /= sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                                  (float)data.ReadDouble(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.TwoFloat:
                        length /= 2 * sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3(data.ReadFloat(),
                                                  data.ReadFloat(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.TwoDouble:
                        length /= 2 * sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)data.ReadDouble(),
                                                  (float)data.ReadDouble(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.ThreeFloat:
                        length /= 3 * sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3(data.ReadFloat(),
                                                  data.ReadFloat(),
                                                  data.ReadFloat()));
                        }
                        break;

                    case FrameType.ThreeDouble:
                        length /= 3 * sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)data.ReadDouble(),
                                                  (float)data.ReadDouble(),
                                                  (float)data.ReadDouble()));
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (type == GraphType.Frame || frame.Any())
                {
                    port.Post(frame);
                }
            });
        }
 public void Process(RemotePacket remotePacket) => _callback(remotePacket);