public async Task ConnectSocket(Socket socket, EndPoint endpoint, NodeConnectionParameters nodeConnectionParameters, CancellationToken cancellationToken)
        {
            var isTor = endpoint.IsTor();

            if (AllowOnlyTorEndpoints && !isTor)
            {
                throw new InvalidOperationException($"The Endpoint connector is configured to allow only Tor endpoints and the '{endpoint}' enpoint is not one");
            }

            var socksSettings  = nodeConnectionParameters.TemplateBehaviors.Find <SocksSettingsBehavior>();
            var socketEndpoint = endpoint;
            var useSocks       = isTor || socksSettings?.OnlyForOnionHosts is false || endpoint.IsI2P();

            if (useSocks)
            {
                if (socksSettings?.SocksEndpoint == null)
                {
                    throw new InvalidOperationException("SocksSettingsBehavior.SocksEndpoint is not set but the connection is expecting using socks proxy");
                }
                socketEndpoint = NormalizeEndpoint(socksSettings.SocksEndpoint);
                await socket.ConnectAsync(socketEndpoint, cancellationToken).ConfigureAwait(false);

                await SocksHelper.Handshake(socket, endpoint, socksSettings.GetCredentials(), cancellationToken).ConfigureAwait(false);
            }
            else
            {
                if (socketEndpoint is DnsEndPoint dnsEndpoint)
                {
                    IDnsResolver resolver = DnsResolver.Instance;
                    if (socksSettings?.SocksEndpoint != null)
                    {
                        resolver = socksSettings.CreateDnsResolver();
                    }
                    var address = (await resolver.GetHostAddressesAsync(dnsEndpoint.Host, cancellationToken)).First();
                    socketEndpoint = new IPEndPoint(address, dnsEndpoint.Port);
                }
                socketEndpoint = NormalizeEndpoint(socketEndpoint);
                await socket.ConnectAsync(socketEndpoint, cancellationToken).ConfigureAwait(false);
            }
        }