/// <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 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);
        }