Esempio n. 1
0
 internal static void Raise(this OnPeerConnected @event, object sender, PeerEventArgs e)
 {
     if (@event != null)
     {
         @event(sender, e);
     }
 }
Esempio n. 2
0
        private async Task AcceptPeers()
        {
            while (true)
            {
                Socket socket;

                try
                {
                    socket = await _listener.AcceptSocketAsync();

                    _logger.LogInformation($"\"{(socket.RemoteEndPoint as IPEndPoint)?.Address}\" is connected");
                }
                catch (ObjectDisposedException)
                {
                    break;
                }
                catch (SocketException)
                {
                    continue;
                }

                var peer = _peerFactory.CreateFrom(socket);

                OnPeerConnected?.Invoke(this, peer);
            }
        }
        void OnNewConnection(int connectionId)
        {
            var connection = AddConnection(connectionId);

            connection.ConnectTask.TrySetResult(new object());
            OnPeerConnected?.Invoke(connection);
        }
Esempio n. 4
0
 public static void Raise(this OnPeerConnected @event, object sender, ChannelEventArgs e)
 {
     if (@event != null)
     {
         @event(sender, e);
     }
 }
Esempio n. 5
0
 /// <summary>
 /// Processes all events appeared since last call
 /// </summary>
 public override void ProcessEvents()
 {
     while (peerConnectionAttemptMessages.TryDequeue(out ENetPeerConnectionAttemptMessage connection_attempt_message))
     {
         ENetPeer peer = new ENetPeer(Guid.NewGuid(), connection_attempt_message.Peer, this);
         OnPeerConnectionAttempted?.Invoke(peer);
         if (IsConnectionAllowed(peer))
         {
             peers.Add(peer.GUID.ToString(), peer);
             peerIDToPeerLookup.Add(peer.Peer.ID, peer);
             OnPeerConnected?.Invoke(peer);
         }
         else
         {
             connection_attempt_message.Peer.Disconnect((uint)EDisconnectionReason.Banned);
         }
     }
     while (peerDisconnectionMessages.TryDequeue(out ENetPeerDisconnectionMessage disconnection_message))
     {
         RemovePeer(disconnection_message.Peer);
     }
     while (peerTimeOutMessages.TryDequeue(out ENetPeerTimeOutMessage time_out_message))
     {
         RemovePeer(time_out_message.Peer);
     }
     while (peerReceiveMessages.TryDequeue(out ENetPeerReceiveMessage receive_message))
     {
         if (peerIDToPeerLookup.ContainsKey(receive_message.Peer.ID))
         {
             OnPeerMessageReceived?.Invoke(peerIDToPeerLookup[receive_message.Peer.ID], receive_message.Message);
         }
     }
 }
Esempio n. 6
0
        protected virtual NetworkConnection OnNewConnection(int connectionId)
        {
            var connection = AddConnection(connectionId);

            if (connection.ConnectInternal())
            {
                OnPeerConnected?.Invoke(connection);
            }
            return(connection);
        }
Esempio n. 7
0
 /// <summary>
 /// Initializes the server.
 /// Only use this if you've set a main channel with <see cref="UNetServer(IServerChannel)"/>
 /// </summary>
 /// <remarks>
 /// May generate a <see cref="ServerInitializationException"/> if used incorrectly
 /// </remarks>
 public void Initialize()
 {
     if (_channelMgr.GetChannel <IServerChannel>(ch => ch is IServerChannel && ch.IsMainChannel) == null)
     {
         throw new ServerInitializationException("Attempt to initialize server without a main channel");
     }
     _channelMgr.GetChannel <IServerChannel>(ch => ch is IServerChannel && ch.IsMainChannel)
     .Start();
     _channelMgr.GetChannel <IServerChannel>(ch => ch is IServerChannel && ch.IsMainChannel)
     .OnPeerConnected +=
         (sender, e) => OnPeerConnected.Raise(sender, e);
 }
Esempio n. 8
0
 /// <summary>
 /// Adds a channel to this server
 /// </summary>
 /// <remarks>
 /// May throw a <see cref="ChannelOperationException"/> if used incorrectly
 /// </remarks>
 /// <param name="channel">The channel to add</param>
 /// <returns>Returns true if channel was added successfully</returns>
 public bool AddChannel(IServerChannel channel)
 {
     if (!_channelMgr.AddChannel(channel))
     {
         return(false);
     }
     OnChannelCreated.Raise(this, new ChannelEventArgs(channel));
     channel.HostServer       = this;
     channel.OnPeerConnected += (sender, e) => OnPeerConnected.Raise(this, e);
     channel.PacketProcessor  = _channelMgr.GetMainChannel().PacketProcessor;
     return(true);
 }
Esempio n. 9
0
 /// <summary>
 /// Initializes the server.
 /// Only use this if you haven't set a main channel with <see cref="UNetServer()"/>
 /// </summary>
 /// <param name="mainChannel">The server main channel to use</param>
 public void Initialize(IServerChannel mainChannel)
 {
     if (_channelMgr.GetChannel <IServerChannel>(ch => ch.IsMainChannel) != null)
     {
         return;
     }
     mainChannel.IsMainChannel = true;
     mainChannel.HostServer    = this;
     _channelMgr.UnsafeAddChannel(mainChannel);
     _channelMgr.GetChannel <IServerChannel>(mainChannel.Id).Start();
     _channelMgr.GetChannel <IServerChannel>(mainChannel.Id).OnPeerConnected +=
         (sender, e) => OnPeerConnected.Raise(sender, e);
 }
Esempio n. 10
0
 private void AcceptPeer(Peer.Peer newPeer)
 {
     newPeer.OnPeerSynchronized +=
         (sender, e) => OnPeerConnected.Raise(this, new ChannelEventArgs(this, e.Peer));
     newPeer.OnPeerDisconnected +=
         (sender, e) =>
     {
         e.Peer.Dispose();
         lock (_lockObj)
             ConnectedPeers.Remove(e.Peer);
     };
     newPeer.OnRawPacketReceived        += RawPacketReceived;
     newPeer.OnSequenceFragmentReceived += (sender, e) => OnSequenceFragmentReceived.Raise(sender, e);
     lock (_lockObj)
         ConnectedPeers.Add(newPeer);
 }
Esempio n. 11
0
        private void AddPeer(EndPoint address, Tracker tracker = null, bool withTracker = false)
        {
            if (!(Peers.Any(peer => peer.Address.Equals(address))) &&
                !(address.Equals(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true))))
            {
                var peer = new Peer(address, Peers, tracker);
                Peers.Add(peer);

                //перенаправляем события пира
                peer.OnRequestBlocksMessage += (s, e) =>
                {
                    OnRequestBlocksMessage?.Invoke(s, e);
                };

                peer.OnRequestTransactionsMessage += (s, e) =>
                {
                    OnRequestTransactionsMessage?.Invoke(s, e);
                };

                peer.OnBlocksMessage += (s, e) =>
                {
                    OnBlocksMessage?.Invoke(s, e);
                };

                peer.OnTransactionsMessage += (s, e) =>
                {
                    OnTransactionsMessage?.Invoke(s, e);
                };

                peer.OnPeersMessage += (s, e) => OnPeersMessage(s, e);



                peer.Connect(withTracker);


                //вызов события подключения пира
                Task.Run(() =>
                {
                    System.Threading.Thread.Sleep(CommonHelpers.MessagesInterval * 5);

                    OnPeerConnected?.Invoke(this, new MessageEventArgs(new Message(), peer.Hash, peer.Address));
                });
            }
        }
Esempio n. 12
0
        private void AcceptCallback(IAsyncResult res)
        {
            if (!IsActive)
            {
                return;
            }
            var newSock = ChannelSocket.EndAccept(res);

            Peer.Peer newPeer;
            if (IsMainChannel)
            {
                newPeer = new Peer.Peer(new SocketIdentity(Manager.GeneratePeerId(), SocketIdentity.GenerateGuid()), newSock, BufferSize, this);
                newPeer.OnPeerDisconnected += (o, e2) =>
                {
                    OnPeerDisconnected.Raise(o, new ChannelEventArgs(this, newPeer));
                };
                newPeer.Receive();
                AcceptPeer(newPeer);
            }
            else
            {
                newPeer = new Peer.Peer(new SocketIdentity(Manager.GeneratePeerId()), newSock, BufferSize, this);
                PendingConnections.Add(new PendingPeerConnection(newPeer.Identity.Guid, newPeer));
                newPeer.OnPeerDisconnected += (o, e2) =>
                {
                    OnPeerDisconnected.Raise(o, new ChannelEventArgs(this, newPeer));
                };
                newPeer.Receive();
                newPeer.OnPeerRelocationRequest += (sender, e) =>
                {
                    if (PendingConnections.FirstOrDefault(pc => pc.Guid == e.PeerGuid && !pc.IsCancelled) != null)
                    {
                        AcceptPeer(newPeer);
                        OnPeerConnected.Raise(this, new ChannelEventArgs(this, e.Peer));

                        lock (_lockObj)
                            PendingConnections.Remove(PendingConnections.First(pc => pc.Guid == e.PeerGuid));
                    }
                };
            }
            ChannelSocket.BeginAccept(AcceptCallback, null);
        }
Esempio n. 13
0
        private void Listener_PeerConnectedEvent(NetPeer peer)
        {
            int id = peer.Id + 1;

            jitterBuffersByPeerId[id] = new JitterBuffer(settings.JitterBufferDelayFrames);

            NetDataWriter writer = new NetDataWriter();

            writer.Put((byte)PacketType.Join);
            writer.Put(id);
            writer.Put(StatefulWorld.Instance.Frame);
            peer.Send(writer, DeliveryMethod.ReliableOrdered);
            writer.Reset();

            Remote.SynchronizeAll();

            NetDebug.Log($"Peer index <b>{peer.Id}</b> connected. Assigned global ID {id}.", LogType.Connection);

            OnPeerConnected?.Invoke(id);
        }
 /// <summary>
 /// Processes all events
 /// </summary>
 public override void ProcessEvents()
 {
     while (localPeerConnectionAttemptMessages.TryDequeue(out LocalPeerConnectionAttemptMessage local_peer_connection_attempt_message))
     {
         IPeer peer = local_peer_connection_attempt_message.Peer;
         OnPeerConnectionAttempted?.Invoke(peer);
         if (IsConnectionAllowed(peer))
         {
             peers.Add(peer.GUID.ToString(), peer);
             OnPeerConnected?.Invoke(peer);
         }
         else
         {
             local_peer_connection_attempt_message.Peer.Disconnect(EDisconnectionReason.Banned);
         }
     }
     while (localPeerDisconnectionMessages.TryDequeue(out LocalPeerDisconnectionMessage local_peer_disconnection_message))
     {
         IPeer  peer = local_peer_disconnection_message.Peer;
         string key  = peer.GUID.ToString();
         if (peers.ContainsKey(key))
         {
             OnPeerDisconnected?.Invoke(peer);
             peers.Remove(key);
         }
         foreach (KeyValuePair <string, ILocalPeer> peer_peer in peerPeerLookup)
         {
             if (peer.GUID == peer_peer.Value.GUID)
             {
                 peerPeerLookup.Remove(peer_peer.Key);
                 break;
             }
         }
     }
     while (localPeerReceiveMessages.TryDequeue(out LocalPeerReceiveMessage local_peer_receive_message))
     {
         OnPeerMessageReceived?.Invoke(local_peer_receive_message.Peer, Compression.Decompress(local_peer_receive_message.Message, local_peer_receive_message.Index, local_peer_receive_message.Length));
     }
 }
Esempio n. 15
0
 public void OnConnected(OnPeerConnected onPeerConnected)
 {
     this.onPeerConnected = onPeerConnected;
 }