/// <summary> /// Broadcast message to all connected peers /// </summary> /// <param name="distributedMessage">Message to be sent</param> public void BroadcastMessage(DistributedMessage distributedMessage) { var id = idsRegister.ResolveId(distributedMessage.AddressKey); if (id != null) { idsRegister.PushId(distributedMessage); TimeManager.PushTimeDifference(distributedMessage); connectionManager.Broadcast(distributedMessage); return; } //Hold message until proper sender registers var key = distributedMessage.AddressKey; if (!awaitingOutgoingMessages.TryGetValue(key, out var messages)) { messages = new List <AwaitingMessage>(); awaitingOutgoingMessages.Add(key, messages); } var awaitingMessage = new AwaitingMessage() { EndPoint = new IPEndPoint(IPAddress.Broadcast, connectionManager.Port), DistributedMessage = distributedMessage }; messages.Add(awaitingMessage); }
/// <summary> /// Method handling incoming message to this receiver /// </summary> /// <param name="distributedMessage">Received message</param> private void MessageReceived(DistributedMessage distributedMessage) { var sender = distributedMessage.Sender; //Check if peer is still connected if (sender == null) { return; } TimeManager.PopTimeDifference(distributedMessage, sender.RemoteTimeTicksDifference); var id = idsRegister.PopId(distributedMessage.Content); var identifiedObject = idsRegister.ResolveObject(id); if (identifiedObject is IMessageReceiver receiver) { //Forward message to proper receiver distributedMessage.AddressKey = identifiedObject.Key; receiver.ReceiveMessage(sender, distributedMessage); distributedMessage.Release(); } else { //Check if it is initialization message for IdsRegister - first sent message if (idsRegister.IsInitializationMessage(sender, distributedMessage)) { // distributedMessage.Release(); return; } //Ignore messages with outdated assigned identifiers if (distributedMessage.Timestamp < idsRegister.InternalIdBindUtcTime) { return; } //Hold message until proper receiver registers if (!awaitingIncomingMessages.TryGetValue(id, out var messages)) { messages = new List <AwaitingMessage>(); awaitingIncomingMessages.Add(id, messages); } var awaitingMessage = new AwaitingMessage() { EndPoint = sender.PeerEndPoint, DistributedMessage = distributedMessage }; messages.Add(awaitingMessage); } }
/// <summary> /// Broadcast message to all connected peers /// </summary> /// <param name="distributedMessage">Message to be sent</param> public void BroadcastMessage(DistributedMessage distributedMessage) { //Check if this message is forwarded, then don't send it back to the sender var connectedPeers = connectionManager.ConnectedPeers; if (connectedPeers.ContainsValue(distributedMessage.Sender)) { foreach (var connectedPeer in connectedPeers) { if (connectedPeer.Value != distributedMessage.Sender) { //Unicast a message copy to every peer excluding the sender UnicastMessage(connectedPeer.Key, new DistributedMessage(distributedMessage)); } } return; } var id = idsRegister.ResolveId(distributedMessage.AddressKey); if (id != null) { idsRegister.PushId(distributedMessage); TimeManager.PushTimeDifference(distributedMessage); connectionManager.Broadcast(distributedMessage); return; } //Hold message until proper sender registers var key = distributedMessage.AddressKey; if (!awaitingOutgoingMessages.TryGetValue(key, out var messages)) { messages = new List <AwaitingMessage>(); awaitingOutgoingMessages.Add(key, messages); } var awaitingMessage = new AwaitingMessage() { EndPoint = new IPEndPoint(IPAddress.Broadcast, connectionManager.Port), DistributedMessage = distributedMessage }; messages.Add(awaitingMessage); }