Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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);
        }