public IPv4V6DualStackSpeculativeConnector(TcpConnectParam basicParam, TcpIpSystem system) : base(basicParam)
        {
            if (basicParam.DestHostname._IsEmpty())
            {
                // IP address is specified
                AddAttempt(new Attempt(system, basicParam, 0));
                return;
            }

            // Hostname is specified
            var hostInfo = system.GetHostInfo(true);

            if (hostInfo.IsIPv4Supported)
            {
                AddAttempt(new Attempt(system, new TcpConnectParam(basicParam.DestHostname, basicParam.DestPort, AddressFamily.InterNetwork,
                                                                   connectTimeout: basicParam.ConnectTimeout, dnsTimeout: basicParam.DnsTimeout), 0));
            }

            if (hostInfo.IsIPv6Supported)
            {
                AddAttempt(new Attempt(system, new TcpConnectParam(basicParam.DestHostname, basicParam.DestPort, AddressFamily.InterNetworkV6,
                                                                   connectTimeout: basicParam.ConnectTimeout, dnsTimeout: basicParam.DnsTimeout), 0));
            }
        }
 public Attempt(ITcpConnectableSystem system, TcpConnectParam param, int postWaitMsecs)
 {
     this.System        = system;
     this.Param         = param;
     this.PostWaitMsecs = postWaitMsecs;
 }
 public ConnSock ConnectIPv4v6Dual(TcpConnectParam param, CancellationToken cancel = default)
 => ConnectIPv4v6DualAsync(param, cancel)._GetResult();
        public async Task <ConnSock> ConnectIPv4v6DualAsync(TcpConnectParam param, CancellationToken cancel = default)
        {
            IPv4V6DualStackSpeculativeConnector connector = new IPv4V6DualStackSpeculativeConnector(param, this);

            return(await connector.ConnectAsync(cancel));
        }
 public SpeculativeConnectorBase(TcpConnectParam basicParam)
 {
     this.BasicParam = basicParam;
 }
        protected override NetTcpProtocolStubBase CreateTcpProtocolStubImpl(TcpConnectParam param, CancellationToken cancel)
        {
            NetPalTcpProtocolStub tcp = new NetPalTcpProtocolStub(cancel: cancel);

            return(tcp);
        }
 protected abstract NetTcpProtocolStubBase CreateTcpProtocolStubImpl(TcpConnectParam param, CancellationToken cancel);