/// <summary> /// Adds client's connection to the list of active connections. /// </summary> /// <param name="connection">Client's connection to add.</param> private void AddClientConnection(NetworkPeerConnection connection) { this.logger.LogTrace("({0}.{1}:{2})", nameof(connection), nameof(connection.Id), connection.Id); this.connectionsById.AddOrReplace(connection.Id, connection); connection.ShutdownComplete.Task.ContinueWith(unused => this.RemoveConnectedClient(connection)); this.logger.LogTrace("(-)"); }
/// <summary> /// Dummy constructor for testing only. /// </summary> /// <param name="dateTimeProvider">Provider of time functions.</param> /// <param name="loggerFactory">Provider of time functions.</param> /// <remarks>TODO: Remove this constructor as soon as we can mock the node in tests.</remarks> public NetworkPeer(IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory) { this.dateTimeProvider = dateTimeProvider; this.loggerFactory = loggerFactory; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.Behaviors = new NetworkPeerBehaviorsCollection(this); this.PeerAddress = new NetworkAddress(); this.Connection = new NetworkPeerConnection(null, this, new TcpClient(), 0, this.ProcessMessageAsync, this.dateTimeProvider, this.loggerFactory); }
/// <summary> /// Removes a connection from the list of active clients' connection. /// </summary> /// <param name="connection">Client to remove and disconnect.</param> private void RemoveConnectedClient(NetworkPeerConnection connection) { this.logger.LogTrace("({0}.{1}:{2})", nameof(connection), nameof(connection.Id), connection.Id); if (!this.connectionsById.TryRemove(connection.Id, out NetworkPeerConnection unused)) { this.logger.LogError("Internal data integration error."); } this.logger.LogTrace("(-)"); }
/// <summary> /// Initializes an instance of the object for outbound network peers. /// </summary> /// <param name="peerAddress">Information about the peer including its network address, protocol version, time of last contact.</param> /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param> /// <param name="parameters">Various settings and requirements related to how the connections with peers are going to be established, or <c>null</c> to use default parameters.</param> /// <param name="networkPeerFactory">Factory for creating P2P network peers.</param> /// <param name="dateTimeProvider">Provider of time functions.</param> /// <param name="loggerFactory">Factory for creating loggers.</param> public NetworkPeer(NetworkAddress peerAddress, Network network, NetworkPeerConnectionParameters parameters, INetworkPeerFactory networkPeerFactory, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory) : this(false, peerAddress, network, parameters, dateTimeProvider, loggerFactory) { TcpClient client = new TcpClient(AddressFamily.InterNetworkV6); client.Client.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); client.Client.ReceiveBufferSize = parameters.ReceiveBufferSize; client.Client.SendBufferSize = parameters.SendBufferSize; this.Connection = networkPeerFactory.CreateNetworkPeerConnection(this, client, this.ProcessMessageAsync); this.logger = loggerFactory.CreateLogger(this.GetType().FullName, $"[{this.Connection.Id}-{peerAddress.Endpoint}] "); this.logger.LogTrace("()"); this.logger.LogTrace("(-)"); }
/// <summary> /// Initializes an instance of the object for inbound network peers with already established connection. /// </summary> /// <param name="peerAddress">Information about the peer including its network address, protocol version, time of last contact.</param> /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param> /// <param name="parameters">Various settings and requirements related to how the connections with peers are going to be established, or <c>null</c> to use default parameters.</param> /// <param name="client">Already connected network client.</param> /// <param name="peerVersion">Version message payload received from the peer.</param> /// <param name="dateTimeProvider">Provider of time functions.</param> /// <param name="loggerFactory">Factory for creating loggers.</param> public NetworkPeer(NetworkAddress peerAddress, Network network, NetworkPeerConnectionParameters parameters, TcpClient client, IDateTimeProvider dateTimeProvider, INetworkPeerFactory networkPeerFactory, ILoggerFactory loggerFactory) : this(true, peerAddress, network, parameters, dateTimeProvider, loggerFactory) { this.Connection = networkPeerFactory.CreateNetworkPeerConnection(this, client, this.ProcessMessageAsync); this.logger = loggerFactory.CreateLogger(this.GetType().FullName, $"[{this.Connection.Id}-{peerAddress.Endpoint}] "); this.logger.LogTrace("()"); this.RemoteSocketEndpoint = this.PeerAddress.Endpoint; this.RemoteSocketAddress = this.RemoteSocketEndpoint.Address; this.RemoteSocketPort = this.RemoteSocketEndpoint.Port; this.ConnectedAt = this.dateTimeProvider.GetUtcNow(); this.logger.LogTrace("Connected to advertised node '{0}'.", this.PeerAddress.Endpoint); this.State = NetworkPeerState.Connected; this.InitDefaultBehaviors(this.Parameters); this.Connection.StartReceiveMessages(); this.logger.LogTrace("(-)"); }