示例#1
0
        private void QueueEndpoints(IEnumerable <string> hosts)
        {
            Throw.IfNull(hosts, nameof(hosts));

            if (!hosts.Any())
            {
                return;
            }

            lock (_knownEndpoints)
            {
                foreach (var host in hosts)
                {
                    Endpoint endpoint = new Endpoint();
                    try
                    {
                        endpoint = Endpoint.FromString(host);
                    }
                    catch (ChainException e)
                    {
                        Logger.Warning("Failed to add endpoint: " + e.Message);
                    }

                    var entry = new EndpointEntry(endpoint);
                    _knownEndpoints.Add(entry);
                }
            }
        }
示例#2
0
        private void HandleConnection(Socket socket)
        {
            var peer = new TCPPeer(socket);

            // this initial message is not only used to fetch chains but also to verify identity of peers
            var requestKind = RequestKind.Chains | RequestKind.Peers;

            if (Capabilities.HasFlag(PeerCaps.Mempool))
            {
                requestKind |= RequestKind.Mempool;
            }

            var request = new RequestMessage(this.Address, this.PublicEndpoint, requestKind, Nexus.Name);
            var active  = SendMessage(peer, request);

            string ip = ((IPEndPoint)(socket.RemoteEndPoint)).Address.ToString();

            Logger.Debug($"Incoming connection from " + ip);

            while (active)
            {
                var msg = peer.Receive();
                if (msg == null)
                {
                    break;
                }

                Logger.Debug($"Got {msg.GetType().Name} from: {msg.Address.Text}");
                foreach (var line in msg.GetDescription())
                {
                    Logger.Debug(line);
                }

                var answer = HandleMessage(peer, msg);
                if (answer != null)
                {
                    if (!SendMessage(peer, answer))
                    {
                        break;
                    }
                }
            }

            Logger.Debug("Disconnected from peer: " + peer.Endpoint);
            lock (_peers)
            {
                var entry = new EndpointEntry(peer.Endpoint);
                _knownEndpoints.Remove(entry);
                Logger.Debug("removed endpoint: " + entry.endpoint);

                var peerKey = peer.Endpoint.ToString();
                if (_peers.ContainsKey(peerKey))
                {
                    _peers.Remove(peerKey);
                    Logger.Message("Removed peer: " + peerKey);
                }
            }

            socket.Close();
        }
示例#3
0
        private void HandleConnection(Socket socket)
        {
            var peer = new TCPPeer(socket);

            lock (_peers)
            {
                Logger.Debug("add Peer: " + peer.Endpoint);
                _peers.Add(peer);
            }

            // this initial message is not only used to fetch chains but also to verify identity of peers
            var requestKind = RequestKind.Chains | RequestKind.Peers;

            if (Capabilities.HasFlag(PeerCaps.Mempool))
            {
                requestKind |= RequestKind.Mempool;
            }

            var request = new RequestMessage(requestKind, Nexus.Name, this.Address);
            var active  = SendMessage(peer, request);

            while (active)
            {
                var msg = peer.Receive();
                if (msg == null)
                {
                    break;
                }

                Logger.Debug($"Got {msg.GetType().Name} from: {msg.Address.Text}");
                foreach (var line in msg.GetDescription())
                {
                    Logger.Debug(line);
                }

                var answer = HandleMessage(peer, msg);
                if (answer != null)
                {
                    if (!SendMessage(peer, answer))
                    {
                        break;
                    }
                }
            }

            Logger.Debug("Disconnected from peer2: " + peer.Endpoint);
            lock (_peers)
            {
                var endpoint = new EndpointEntry(peer.Endpoint);
                _knownEndpoints.Remove(endpoint);
                Logger.Debug("endpoint removed ");
                _peers.Remove(peer);
                Logger.Debug("peer removed");
            }

            socket.Close();
        }
示例#4
0
        private void QueueEndpoints(IEnumerable <Endpoint> endpoints)
        {
            Throw.IfNull(endpoints, nameof(endpoints));

            if (!endpoints.Any())
            {
                return;
            }

            lock (_knownEndpoints)
            {
                foreach (var endpoint in endpoints)
                {
                    var entry = new EndpointEntry(endpoint);
                    _knownEndpoints.Add(entry);
                }
            }
        }
示例#5
0
 protected bool Equals(EndpointEntry other)
 {
     return(this.endpoint.Equals(other.endpoint));
 }