コード例 #1
0
        private void ThreadMain()
        {
            Message("Starting Read");

            BinaryReader reader = new BinaryReader(netStream);

            try
            {
                var f = new BinaryFormatter();

                byte[] header = new byte[8];
                while (!closed)
                {
                    reader.RemainingBytes = 8;
                    uint channel = reader.NextUInt();
                    reader.RemainingBytes = reader.NextInt();


                    try
                    {
                        switch (channel)
                        {
                        case (uint)ChannelID.RegisterLink:
                            ShardID remoteID = reader.NextShardID();
                            ShardID localID  = reader.NextShardID();
                            if (localID != Simulation.ID)
                            {
                                throw new IntegrityViolation("Remote shard expected this shard to be " + localID + ", not " + Simulation.ID);
                            }
                            var lnk = linkLookup?.Invoke(remoteID);
                            if (lnk == null)
                            {
                                throw new IntegrityViolation("Remote shard identifies as " + remoteID + ", but this is not a known neighbor of this shard " + Simulation.ID);
                            }
                            lnk.SetPassiveClient(client);
                            Abandon();
                            break;

                        case (uint)ChannelID.RegisterReceiver:
                            Guid guid = reader.NextGuid();
                            if (!guids.Contains(guid))
                            {
                                Message("Authenticating as " + guid);
                                guids.Add(guid);
                                while (!guidMap.TryAdd(guid, this))
                                {
                                    InteractionLink link;
                                    if (guidMap.TryRemove(guid, out link))
                                    {
                                        Message("Was already registered by " + link + ". Replacing...");
                                    }
                                }
                                Message("Authenticated as " + guid);
                                OnRegisterReceiver?.Invoke(guid);
                            }
                            break;

                        case (uint)ChannelID.ShardLookup:
                        {
                            ShardID id   = reader.NextShardID();
                            var     addr = BaseDB.TryGetAddress(id);
                            using (MemoryStream ms = new MemoryStream())
                            {
                                var str = Encoding.ASCII.GetBytes(addr.Host);
                                ms.Write(id.AsBytes, 0, 16);
                                ms.Write(BitConverter.GetBytes(str.Length), 0, 4);
                                ms.Write(str, 0, str.Length);
                                ms.Write(BitConverter.GetBytes((ushort)addr.PeerPort), 0, 2);
                                Send(new OutPackage((uint)ChannelID.ShardLookupResponse, ms.ToArray()));
                            }
                        }
                        break;

                        case (uint)ChannelID.UnregisterReceiver:
                        {
                            guid = reader.NextGuid();
                            if (guids.Contains(guid))
                            {
                                Message("De-Authenticating as " + guid);
                                guids.Remove(guid);
                                guidMap.TryRemove(guid);
                                OnUnregisterReceiver?.Invoke(guid);
                            }
                        }
                        break;

                        case (uint)ChannelID.SendMessage:
                        {
                            Guid   from       = reader.NextGuid();
                            Guid   to         = reader.NextGuid();
                            Guid   id         = reader.NextGuid();
                            int    msgChannel = reader.NextInt();
                            byte[] data       = reader.NextBytes();

                            //int targetGen = Simulation.EstimateNextSuitableMessageTargetGeneration();
                            if (!guids.Contains(from))
                            {
                                Error("Not registered as " + from + ". Ignoring message");
                            }
                            else
                            {
                                //int gen = Simulation.Stack.NewestFinishedSDSGeneration;
                                ClientMessage msg = new ClientMessage(new ClientMessageID(from, to, id, msgChannel, orderIndex), data);

                                var sender = new Address(this.endPoint);
                                Simulation.Consensus?.Dispatch(msg, sender);
                                OnMessage?.Invoke(msg, sender);
                            }
                        }
                        break;
                        }
                    }
                    catch (SerializationException ex)
                    {
                        Error(ex);
                    }
                    reader.SkipRemaining();
                }
            }
            catch (SocketException)
            {}
            catch (Exception ex)
            {
                Error(ex);
            }
            Close();
        }
コード例 #2
0
ファイル: MessageHistory.cs プロジェクト: IronFox/Shard
 public void Add(ClientMessage msg)
 {
     incomingMessages.Add(msg);
 }
コード例 #3
0
ファイル: SDS.cs プロジェクト: IronFox/Shard
 public void AddB(ClientMessage m)
 {
     b.Add(m.ID.MessageID, m);
 }
コード例 #4
0
ファイル: SDS.cs プロジェクト: IronFox/Shard
 public void AddB(Guid receivingEntity, ClientMessage message)
 {
     messages.GetOrCreate(receivingEntity).AddB(message);
 }
コード例 #5
0
ファイル: SDS.cs プロジェクト: IronFox/Shard
 public void AddA(ClientMessage m)
 {
     a.Add(m.ID.MessageID, m);
 }