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