/// <inheritdoc/> public async Task <INetworkPeer> CreateConnectedNetworkPeerAsync( IPEndPoint peerEndPoint, NetworkPeerConnectionParameters parameters = null, NetworkPeerDisposer networkPeerDisposer = null) { Guard.NotNull(peerEndPoint, nameof(peerEndPoint)); Action <INetworkPeer> onDisconnected = null; if (networkPeerDisposer != null) { onDisconnected = networkPeerDisposer.OnPeerDisconnectedHandler; } var peer = new NetworkPeer(peerEndPoint, this.network, parameters, this, this.dateTimeProvider, this.loggerFactory, this.selfEndpointTracker, this.asyncProvider, onDisconnected, this.onSendingMessage); try { await peer.ConnectAsync(peer.ConnectionParameters.ConnectCancellation).ConfigureAwait(false); networkPeerDisposer?.AddPeer(peer); } catch { peer.Dispose(); throw; } return(peer); }
/// <inheritdoc/> public async Task <INetworkPeer> CreateConnectedNetworkPeerAsync( string endPoint, uint myVersion, bool isRelay = true, CancellationToken cancellation = default(CancellationToken), NetworkPeerDisposer networkPeerDisposer = null) { Guard.NotNull(endPoint, nameof(endPoint)); IPEndPoint ipEndPoint = Utils.ParseIpEndpoint(endPoint, this.network.DefaultPort); var parameters = new NetworkPeerConnectionParameters() { ConnectCancellation = cancellation, IsRelay = isRelay, Version = myVersion, Services = NetworkPeerServices.Nothing, }; return(await this.CreateConnectedNetworkPeerAsync(ipEndPoint, parameters, networkPeerDisposer).ConfigureAwait(false)); }
/// <summary> /// Initializes instance of a network peer server. /// </summary> /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param> /// <param name="localEndPoint">IP address and port to listen on.</param> /// <param name="externalEndPoint">IP address and port that the server is reachable from the Internet on.</param> /// <param name="version">Version of the network protocol that the server should run.</param> /// <param name="loggerFactory">Factory for creating loggers.</param> /// <param name="networkPeerFactory">Factory for creating P2P network peers.</param> /// <param name="initialBlockDownloadState">Provider of IBD state.</param> /// <param name="connectionManagerSettings">Configuration related to incoming and outgoing connections.</param> public NetworkPeerServer(Network network, IPEndPoint localEndPoint, IPEndPoint externalEndPoint, uint version, ILoggerFactory loggerFactory, INetworkPeerFactory networkPeerFactory, IInitialBlockDownloadState initialBlockDownloadState, ConnectionManagerSettings connectionManagerSettings, IAsyncProvider asyncProvider, IPeerAddressManager peerAddressManager, IDateTimeProvider dateTimeProvider) { this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.signals = asyncProvider.Signals; this.networkPeerFactory = networkPeerFactory; this.networkPeerDisposer = new NetworkPeerDisposer(loggerFactory, asyncProvider); this.initialBlockDownloadState = initialBlockDownloadState; this.connectionManagerSettings = connectionManagerSettings; this.peerAddressManager = peerAddressManager; this.dateTimeProvider = dateTimeProvider; this.InboundNetworkPeerConnectionParameters = new NetworkPeerConnectionParameters(); this.LocalEndpoint = Utils.EnsureIPv6(localEndPoint); this.ExternalEndpoint = Utils.EnsureIPv6(externalEndPoint); this.Network = network; this.Version = version; this.serverCancel = new CancellationTokenSource(); this.tcpListener = new TcpListener(this.LocalEndpoint); this.tcpListener.Server.LingerState = new LingerOption(true, 0); this.tcpListener.Server.NoDelay = true; this.tcpListener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); this.acceptTask = Task.CompletedTask; this.logger.LogDebug("Network peer server ready to listen on '{0}'.", this.LocalEndpoint); }
/// <inheritdoc/> public INetworkPeer CreateNetworkPeer(TcpClient client, NetworkPeerConnectionParameters parameters = null, NetworkPeerDisposer networkPeerDisposer = null) { Guard.NotNull(client, nameof(client)); Action <INetworkPeer> onDisconnected = null; if (networkPeerDisposer != null) { onDisconnected = networkPeerDisposer.OnPeerDisconnectedHandler; } var peer = new NetworkPeer((IPEndPoint)client.Client.RemoteEndPoint, this.network, parameters, client, this.dateTimeProvider, this, this.loggerFactory, this.selfEndpointTracker, this.asyncProvider, onDisconnected, this.onSendingMessage); networkPeerDisposer?.AddPeer(peer); return(peer); }