Esempio n. 1
0
        private void ProcessPeers()
        {
            if (Interlocked.Exchange(ref _isProcessPeers, 1) == 1)
            {
                return;
            }

            foreach (var peer in Peers.OrderByDescending(x => x.Value.PiecesRequiredAvailable))
            {
                if (DateTime.UtcNow > peer.Value.LastActive.Add(PeerTimeout))
                {
                    peer.Value.Disconnect();
                    continue;
                }

                if (!peer.Value.IsHandshakeSent || !peer.Value.IsHandshakeReceived)
                {
                    continue;
                }

                if (Torrent.IsCompleted)
                {
                    peer.Value.SendNotInterested();
                }
                else
                {
                    peer.Value.SendInterested();
                }

                if (peer.Value.IsCompleted && Torrent.IsCompleted)
                {
                    peer.Value.Disconnect();
                    continue;
                }

                peer.Value.SendKeepAlive();

                // let them leech
                if (Torrent.IsStarted && Leechers.Count < MaxLeechers)
                {
                    if (peer.Value.IsInterestedReceived && peer.Value.IsChokeSent)
                    {
                        peer.Value.SendUnchoke();
                    }
                }

                // ask to leech
                if (!Torrent.IsCompleted && Seeders.Count <= MaxSeeders)
                {
                    if (!peer.Value.IsChokeReceived)
                    {
                        Seeders.TryAdd(peer.Key, peer.Value);
                    }
                }
            }

            Interlocked.Exchange(ref _isProcessPeers, 0);
        }
Esempio n. 2
0
 public override int GetHashCode()
 {
     return(ProvideBufLen.GetHashCode()
            + Wantlist.GetHashCode()
            + Peers.GetHashCode()
            + BlocksReceived.GetHashCode()
            + DupBlksReceived.GetHashCode()
            + DupDataReceived.GetHashCode());
 }
Esempio n. 3
0
        public void SendPlaySound(Vector3?position, MySoundCuesEnum id)
        {
            var msg = new MyEventPlaySound();

            msg.Position  = position;
            msg.SoundEnum = (int)id;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered);
        }
Esempio n. 4
0
        public void SendSetActorFaction(MyActorEnum actor, MyMwcObjectBuilder_FactionEnum faction)
        {
            var msg = new MyEventSetActorFaction();

            msg.ActorId = (int)actor;
            msg.Faction = faction;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered);
        }
        public void RequestFaction(MyMwcObjectBuilder_FactionEnum preferredFaction)
        {
            Log("Choose faction");

            var msg = new MyEventChooseFaction();

            msg.PreferredFaction = preferredFaction;
            Peers.SendHost(ref msg);
        }
Esempio n. 6
0
        private double GetPieceRarity(int index)
        {
            if (Peers.Count < 1)
            {
                return(0.0);
            }

            return(Peers.Average(x => x.Value.IsPieceDownloaded[index] ? 0.0 : 1.0));
        }
Esempio n. 7
0
        private void OnPeerDisconnected(PeerDisconnected data)
        {
            Notifications.Enqueue(new PeerDisconnectedNotification(data.Peer));

            Peers.Remove(data.Peer);
            Remotes.Remove(data.Remote);
            DataMap?.Handle(data);
            Sender?.Remove(data.Peer);
        }
Esempio n. 8
0
        public void SendMessageToPeer(Message message, EndPoint address)
        {
            var peerReciever = Peers.FirstOrDefault(peer => peer.Address.Equals(address));

            if (peerReciever != null)
            {
                peerReciever.SendMessage(message);
            }
        }
Esempio n. 9
0
 public void CreateOverlay()
 {
     if (this.Peers.Count == 0)
     {
         //create overlay SP first
         Nod superPeer = new Nod(0, 0, true);
         Peers.Add(superPeer);
         LastNode = superPeer;
     }
 }
Esempio n. 10
0
        public void LeaveOverlay(Nod node)
        {
            if (node.IsSuperPeer)
            {
                Console.WriteLine("Not implemented");
            }

            UpdateAllNeihhbours(node);
            Peers.Remove(Peers.Single(x => x.Id == node.Id));
        }
        public void SpeacialWeaponEvent(MySpecialWeaponEventEnum eventType, MyMwcObjectBuilder_SmallShip_Weapon_TypesEnum weapon)
        {
            MyEventSpeacialWeapon msg = new MyEventSpeacialWeapon();

            msg.ShipEntityId = MySession.PlayerShip.EntityId.Value.NumericValue;
            msg.Weapon       = weapon;
            msg.WeaponEvent  = eventType;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableUnordered);
        }
Esempio n. 12
0
        public void DisconnectFromServer()
        {
            new Task(() =>
            {
                IsDisconnecting = true;
                var task        = Conductor.Instance.DisconnectFromServer();
            }).Start();

            Peers?.Clear();
        }
        public void SendEvent(Vector3 position, MyGlobalEventEnum eventType, int seed, Vector3 up, Vector3 forward)
        {
            var msg = new MyEventEvent();

            msg.Position      = new MyMwcPositionAndOrientation(position, forward, up);
            msg.EventTypeEnum = (int)eventType;
            msg.Seed          = seed;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered);
        }
        public void NewEntity(MyMwcObjectBuilder_Base objectBuilder, Matrix matrix)
        {
            Debug.Assert(objectBuilder.EntityId.HasValue, "EntityId must be set");

            var msg = new MyEventNewEntity();

            msg.ObjectBuilder = objectBuilder;
            msg.Position      = new MyMwcPositionAndOrientation(matrix);
            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered, 0, DEFAULT_LARGE_MESSAGE_SIZE);
        }
        public PeerApiModel AddNewlyConnectedPeer(PeerApiModel p)
        {
            if (!IsPeerExists(p.Url))
            {
                Peer peer = new Peer(p.Url, p.Name);
                Peers.Add(peer);
            }

            return(PeerApiModel.FromPeer(Current));
        }
Esempio n. 16
0
        protected virtual void RemovePeer(string id)
        {
            if (id == null)
            {
                return;
            }
            PeerState removed;

            Peers.TryRemove(id, out removed);
        }
Esempio n. 17
0
        private static async void Peer_OnDisconnect(object sender, uint e)
        {
            ENetPeer peer = sender as ENetPeer;

            Console.WriteLine("Peer disconnected");
            await peer.SendLeave();

            peer.Data = null;
            Peers.Remove(peer);
        }
Esempio n. 18
0
        private void OnPeerConnected(PeerConnected data)
        {
            Notifications.Enqueue(new PeerConnectedNotification(data.Peer));

            Peers.Add(data.Peer);
            DataMap?.Handle(data);

            Sender?.Add(data.Peer, data.Connection);
            Receiver?.StartProcessing(data.Peer, data.Connection);
        }
Esempio n. 19
0
        public void RemovePeer(Guid address)
        {
            var peer = Peers.Where(p => p.Address == address).FirstOrDefault();

            if (peer != null)
            {
                Peers.Remove(peer);
                EventHub.Publish_PeerLeaved(new BlockChainEventArgs(peer, peer));
            }
        }
Esempio n. 20
0
        public void SendSetFactionRelation(MyMwcObjectBuilder_FactionEnum factionA, MyMwcObjectBuilder_FactionEnum factionB, float relation)
        {
            var msg = new MyEventSetFactionRelation();

            msg.FactionA = factionA;
            msg.FactionB = factionB;
            msg.Relation = relation;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered);
        }
Esempio n. 21
0
        public void SendMissionProgress(MyMissionBase mission, MyMissionProgressType progressType, MyTextsWrapperEnum?messageEnum = null)
        {
            MyEventMissionProgress message = new MyEventMissionProgress();

            message.MissionId    = mission != null ? (int)mission.ID : (int?)null;
            message.ProgressType = progressType;
            message.MessageEnum  = messageEnum.HasValue ? (int)messageEnum.Value : (int?)null;

            Peers.SendToAll(ref message, NetDeliveryMethod.ReliableOrdered);
        }
Esempio n. 22
0
        private void EventHub_Join(IrcClient client, IrcMessageEventArgs <JoinMessage> e)
        {
            var channel = Channels.GetChannel(e.IrcMessage.Channel);

            if (e.IrcMessage.Nick != User.Nick)
            {
                var user = Peers.GetUser(e.IrcMessage.Nick);
                channel.AddUser(user, string.Empty);
            }
        }
Esempio n. 23
0
        public Peer AddPeer(int computingPower)
        {
            //var peer = new Peer(computingPower, BlockChain.GetCopy());
            var peer = new Peer(computingPower, BlockChain);

            Peers.Add(peer);

            EventHub.Publish_NewPeerConected(new BlockChainEventArgs(peer, peer));
            Logger.LogInformation($"New Peer Connected :{peer.ToString()} Peers Count:{Peers.Count}");
            return(peer);
        }
 public void ExplodeAmmo(MyAmmoBase ammo)
 {
     // Explode only my missiles to prevent circullar SEND/RECEIVE
     if (IsControlledByMe(ammo))
     {
         var msg = new MyEventAmmoExplosion();
         msg.AmmoBaseEntityId = ammo.EntityId.Value.NumericValue;
         msg.Position         = new MyMwcPositionAndOrientation(ammo.WorldMatrix);
         Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableUnordered);
     }
 }
Esempio n. 25
0
        public void SendSetEntityFaction(MyEntity entity, MyMwcObjectBuilder_FactionEnum faction)
        {
            Debug.Assert(entity.EntityId.HasValue, "Entity must have id");

            var msg = new MyEventSetEntityFaction();

            msg.Faction  = faction;
            msg.EntityId = entity.EntityId.Value.NumericValue;

            Peers.SendToAll(ref msg, NetDeliveryMethod.ReliableOrdered);
        }
        public void ResetEntity(MyEntity entity)
        {
            Debug.Assert(entity.EntityId.HasValue);

            if (IsControlledByMe(entity))
            {
                MyEventEntityReset msg = new MyEventEntityReset();
                msg.EntityId = entity.EntityId.Value.NumericValue;
                Peers.SendToAll(ref msg);
            }
        }
Esempio n. 27
0
        /// <summary>
        /// Try lock entity and announce to other players (runs only on host)
        /// </summary>
        bool TryLockEntity(uint entityId, byte playerId, bool enable)
        {
            bool success = true;

            if (enable)
            {
                using (m_lockedEntitiesLock.AcquireExclusiveUsing())
                {
                    success = !m_lockedEntities.ContainsKey(entityId);

                    if (success)
                    {
                        m_lockedEntities[entityId] = playerId;
                        MyEntities.GetEntityById(entityId.ToEntityId()).OnClosing += m_unlockOnClosing;
                    }
                }
            }
            else
            {
                using (m_lockedEntitiesLock.AcquireExclusiveUsing())
                {
                    success = m_lockedEntities.Remove(entityId);
                    MyEntity entity;
                    if (MyEntities.TryGetEntityById(entityId.ToEntityId(), out entity))
                    {
                        entity.OnClosing -= m_unlockOnClosing;
                    }
                }
            }

            if (success)
            {
                // Send lock to all
                MyEventLock response = new MyEventLock();
                response.EntityId = entityId;
                response.LockType = enable ? MyLockEnum.LOCK : MyLockEnum.UNLOCK;
                Peers.SendToAll(ref response, NetDeliveryMethod.ReliableOrdered, 0);
            }

            if (enable)
            {
                // Send response to player
                MyPlayerRemote player;
                if (Peers.TryGetPlayer(playerId, out player))
                {
                    MyEventLockResult response = new MyEventLockResult();
                    response.EntityId  = entityId;
                    response.IsSuccess = success;
                    Peers.NetworkClient.Send(ref response, player.Connection, NetDeliveryMethod.ReliableOrdered, 0);
                }
            }

            return(success);
        }
Esempio n. 28
0
 /// <summary>
 /// Register that a peer is dead
 /// </summary>
 /// <param name="peer">The peer to save as dead</param>
 public void PeerIsDead(IPAddress peer)
 {
     if (Vote != null) //Need to be checked as a peer might die before a person votes on this computer
     {
         Vote.SetPeerState(peer, PeerState.Dead);
     }
     else
     {
         Peers.Remove(peer);
     }
 }
Esempio n. 29
0
        private static void AddPeer(Peer peer)
        {
            Random rand = new Random();

            peer.ConnectToPeer(1300);

            if (!Peers.TryAdd(rand.Next(), peer))
            {
                peer.Disconnect();
            }
        }
Esempio n. 30
0
        /// <summary>
        /// Removes a peer from the peer list
        /// </summary>
        /// <param name="Peer">The peer to remove</param>
        public void RemovePeer(P2pPeer Peer)
        {
            // Lock peer list to prevent race conditions
            lock (Peers)
            {
                // Stop this peer
                Peer.Stop();

                // Remove this peer from our peer list
                Peers.RemoveAll(x => x == Peer);
            }
        }
Esempio n. 31
0
        private Peers GetColumnPeersForValueCell(Int32 column, Int32 row)
        {
            var peers = new Peers();

              /* Backtrack until a SumCell is hit. */
              var startRow = row;
              while (!(this._cells[column, --startRow] is SumCell))
            ;

              peers.Sum = (this._cells[column, startRow] as SumCell).Down;

              /* Go forward until another SumCell or the edge of the puzzle's column is hit. */
              while ((++startRow < this._height) && !(this._cells[column, startRow] is SumCell))
            peers.Add(this._cells[column, startRow] as ValueCell);

              return peers;
        }
Esempio n. 32
0
        private Peers GetRowPeersForValueCell(Int32 column, Int32 row)
        {
            var peers = new Peers();

              /* Backtrack until a SumCell is hit. */
              var startColumn = column;
              while (!(this._cells[--startColumn, row] is SumCell))
            ;

              peers.Sum = (this._cells[startColumn, row] as SumCell).Right;

              /* Go forward until another SumCell or the edge of the puzzle's row is hit. */
              while ((++startColumn < this._width) && !(this._cells[startColumn, row] is SumCell))
            peers.Add(this._cells[startColumn, row] as ValueCell);

              return peers;
        }