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(); }
public void Add(ClientMessage msg) { incomingMessages.Add(msg); }
public void AddB(ClientMessage m) { b.Add(m.ID.MessageID, m); }
public void AddB(Guid receivingEntity, ClientMessage message) { messages.GetOrCreate(receivingEntity).AddB(message); }
public void AddA(ClientMessage m) { a.Add(m.ID.MessageID, m); }