public static async Task <SslSock> SslStartClientAsync(this ConnSock baseSock, PalSslClientAuthenticationOptions sslOptions, CancellationToken cancel = default)
    {
        SslSock ret = new SslSock(baseSock);

        await ret.StartSslClientAsync(sslOptions, cancel);

        return(ret);
    }
Example #2
0
    public async Task <WtcSocket> WideClientConnectAsync(string pcid, WideTunnelClientOptions clientOptions, bool noCache, CancellationToken cancel = default)
    {
        bool retryFlag = false;

L_RETRY:
        WtConnectParam connectParam = await WideClientConnectInnerAsync(pcid, clientOptions, noCache, cancel);

        $"WideClientConnect: pcid {pcid}: Redirecting to {connectParam.HostName}:{connectParam.Port} (CacheUsed = {connectParam.CacheUsed}) ..."._Debug();

        try
        {
            ConnSock tcpSock = await this.TcpIp.ConnectAsync(new TcpConnectParam(connectParam.HostName, connectParam.Port, AddressFamily.InterNetwork, connectTimeout : CoresConfig.WtcConfig.WpcTimeoutMsec, dnsTimeout : CoresConfig.WtcConfig.WpcTimeoutMsec), cancel);

            try
            {
                ConnSock targetSock = tcpSock;

                try
                {
                    PalSslClientAuthenticationOptions sslOptions = new PalSslClientAuthenticationOptions(connectParam.HostName, false, (cert) => this.CheckValidationCallback(this, cert.NativeCertificate, null, SslPolicyErrors.None));

                    SslSock sslSock = new SslSock(tcpSock);
                    try
                    {
                        await sslSock.StartSslClientAsync(sslOptions, cancel);

                        targetSock = sslSock;
                    }
                    catch
                    {
                        await sslSock._DisposeSafeAsync();

                        throw;
                    }

                    WtcSocket wtcSocket = new WtcSocket(targetSock, new WtcOptions(this, connectParam));

                    await wtcSocket.StartWtcAsync(cancel);

                    return(wtcSocket);
                }
                catch
                {
                    await targetSock._DisposeSafeAsync();

                    throw;
                }
            }
            catch
            {
                await tcpSock._DisposeSafeAsync();

                throw;
            }
        }
        catch
        {
            if (connectParam.CacheUsed && retryFlag == false)
            {
                retryFlag = true;

                // 接続キャッシュを使用して接続することに失敗した
                // 場合はキャッシュを消去して再試行する
                WideTunnel.ConnectParamCache.Delete(pcid);

                $"WideClientConnect: pcid {pcid}: Connect with Session Cache Failed. Retrying..."._Debug();
                goto L_RETRY;
            }

            throw;
        }
    }
Example #3
0
    public static async Task <WebSocket> ConnectAsync(string uri, WebSocketConnectOptions?options = null, CancellationToken cancel = default)
    {
        if (options == null)
        {
            options = new WebSocketConnectOptions();
        }

        Uri u = new Uri(uri);

        int  port   = 0;
        bool useSsl = false;

        if (u.Scheme._IsSamei("ws"))
        {
            port = Consts.Ports.Http;
        }
        else if (u.Scheme._IsSamei("wss"))
        {
            port   = Consts.Ports.Https;
            useSsl = true;
        }
        else
        {
            throw new ArgumentException($"uri \"{uri}\" is not a WebSocket address.");
        }

        if (u.IsDefaultPort == false)
        {
            port = u.Port;
        }

        ConnSock tcpSock = await LocalNet.ConnectIPv4v6DualAsync(new TcpConnectParam(u.Host, port, connectTimeout : options.WebSocketOptions.TimeoutOpen, dnsTimeout : options.WebSocketOptions.TimeoutOpen), cancel);

        try
        {
            ConnSock targetSock = tcpSock;

            try
            {
                if (useSsl)
                {
                    SslSock sslSock = new SslSock(tcpSock);
                    try
                    {
                        options.SslOptions.TargetHost = u.Host;

                        await sslSock.StartSslClientAsync(options.SslOptions, cancel);

                        targetSock = sslSock;
                    }
                    catch
                    {
                        sslSock._DisposeSafe();
                        throw;
                    }
                }

                WebSocket webSock = new WebSocket(targetSock, options.WebSocketOptions);

                await webSock.StartWebSocketClientAsync(uri, cancel);

                return(webSock);
            }
            catch
            {
                targetSock.Dispose();
                throw;
            }
        }
        catch
        {
            tcpSock._DisposeSafe();
            throw;
        }
    }