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