/// <summary> /// Sends the given message over the network to the other endpoint. /// </summary> public void SendMessage(OutgoingMessage outgoingMessage) { LaggedMessage nextLaggedMessage = this.pairedNetworkConnection.getMessageToAddToIncomingQueue(); double now = this.stopwatch.Elapsed.TotalMilliseconds; nextLaggedMessage.LaggedArrivalTime = now + this.SimulatedLatency; nextLaggedMessage.IncomingMessage.CopyFrom(outgoingMessage); }
/// <summary> /// Returns a message that will be added to the queue of messages that have arrived. This will always return a /// message and the message is immediately added to the queue. The consumer must fill in the data of the message. /// </summary> private LaggedMessage getMessageToAddToIncomingQueue() { LaggedMessage pooledLaggedMessage; if (this.pooledIncomingMessages.Count == 0) { pooledLaggedMessage = new LaggedMessage(new IncomingMessage(new byte[this.MaxMessageSize])); } else { pooledLaggedMessage = this.pooledIncomingMessages.Dequeue(); } this.nextIncomingMessages.Enqueue(pooledLaggedMessage); pooledLaggedMessage.IncomingMessage.Clear(); return(pooledLaggedMessage); }
/// <summary> /// Returns the next message that is coming in over the network. Returns null if no message is ready. /// </summary> public IncomingMessage GetNextIncomingMessage() { if (this.nextIncomingMessages.Count == 0) { return(null); } double now = this.stopwatch.Elapsed.TotalMilliseconds; if (this.nextIncomingMessages.Peek().LaggedArrivalTime > now) { return(null); } LaggedMessage nextLaggedMessage = this.nextIncomingMessages.Dequeue(); this.pooledIncomingMessages.Enqueue(nextLaggedMessage); nextLaggedMessage.IncomingMessage.Reset(); return(nextLaggedMessage.IncomingMessage); }