Exemplo n.º 1
0
        public void SendMessage(string msg)
        {
            MessageIdentifier mid = new MessageIdentifier();

            mid.sender = tlv_utils.getSelfID();
            mid.nonce  = tlv_utils.nextDataNonce();
            // Send the message only if it is not too big
            if (messages.PackTLV(tlv_utils.data(mid.sender, mid.nonce, msg)) != null)
            {
                MessageFloodInfo mii = InitNewFloodInfo(msg);
                recent_messages[mid] = mii;
                new_message_action(mid.sender, msg);
            }
        }
Exemplo n.º 2
0
        MessageFloodInfo InitNewFloodInfo(string msg)
        {
            Dictionary <PeerAddress, NeighborFloodInfo> neighbors = new Dictionary <PeerAddress, NeighborFloodInfo>();

            foreach (PeerAddress p in peers.GetSymetricsNeighbors())
            {
                NeighborFloodInfo nii = new NeighborFloodInfo();
                nii.numberAttempts         = 0;
                nii.nextAttemptMillisecond = ComputeNextFloodAttempt(nii.numberAttempts);
                nii.lastAttempt            = Stopwatch.StartNew();
                neighbors[p] = nii;
            }
            MessageFloodInfo mii = new MessageFloodInfo();

            mii.neighbors   = neighbors;
            mii.timeElapsed = Stopwatch.StartNew();
            mii.msg         = msg;
            return(mii);
        }
Exemplo n.º 3
0
        public void TreatTLV(PeerAddress a, TLV tlv)
        {
            try
            {
                TLV_utils.DataMessage dm;
                switch (tlv.type)
                {
                case TLV.Type.Data:
                    dm = tlv_utils.getDataMessage(tlv);
                    if (dm != null && peers.IsSymetricNeighbor(a))
                    {
                        MessageIdentifier mid = new MessageIdentifier();
                        mid.nonce  = dm.nonce;
                        mid.sender = dm.sender;

                        // Adding message to the flooding list...
                        if (!recent_messages.ContainsKey(mid))
                        {
                            MessageFloodInfo mii = InitNewFloodInfo(dm.msg);
                            recent_messages[mid] = mii;
                            new_message_action(mid.sender, dm.msg);
                        }
                        // Ack & Remove from flooding list
                        com.SendMessage(a, messages.PackTLV(tlv_utils.ack(mid.sender, mid.nonce)));
                        try { recent_messages[mid].neighbors.Remove(a); } catch { }
                    }
                    break;

                case TLV.Type.Ack:
                    dm = tlv_utils.getAckMessage(tlv);
                    if (dm != null && peers.IsSymetricNeighbor(a))
                    {
                        MessageIdentifier mid = new MessageIdentifier();
                        mid.nonce  = dm.nonce;
                        mid.sender = dm.sender;
                        try { recent_messages[mid].neighbors.Remove(a); } catch { }
                    }
                    break;
                }
            }
            catch { }
        }