private async Task beginAcceptTcpClient() { TcpClient tcpClient = null; try { tcpClient = await listener.AcceptTcpClientAsync(); var uri = new Uri(serverModel.Url); QpClient qpClient = null; switch (uri.Scheme) { case "tcp": qpClient = new QpTcpClient(new QpTcpClientOptions() { Host = uri.Host, Port = uri.Port, Password = serverModel.Password, EnableCompress = serverModel.EnableCompress, EnableEncrypt = serverModel.EnableEncrypt, InstructionSet = new[] { TcpGuard.Core.Protocol.V1.Instruction.Instance } }); break; case "ws": qpClient = new QpWebSocketClient(new QpWebSocketClientOptions() { Url = serverModel.Url, Password = serverModel.Password, EnableCompress = serverModel.EnableCompress, EnableEncrypt = serverModel.EnableEncrypt, InstructionSet = new[] { TcpGuard.Core.Protocol.V1.Instruction.Instance } }); break; } qpClient.Disconnected += (sender, e) => { try { tcpClient.Close(); } catch { } }; await qpClient.ConnectAsync(); //check version { var rep = await qpClient.SendCommand(new GetVersionCommand()); if (rep.Code != 0) { throw new ApplicationException("Get server verion error,reason:" + rep.Message); } var serverVersion = rep.Data; var clientVersion = this.GetType().Assembly.GetName().Version; if (clientVersion != serverVersion) { throw new ApplicationException($"Client[{clientVersion}] and server[{serverVersion}] version not match."); } } //connect { var rep = await qpClient.SendCommand(ConnectCommand.Create(new ConnectCommand.CommandContent() { Host = portalModel.RemoteHost, Port = portalModel.RemotePort, SendInterval = portalModel.SendInterval })); if (rep.Code != 0) { qpClient.Close(); throw new ApplicationException(rep.Message); } } var portal = new Portal(qpClient, tcpClient, portalModel.SendInterval); portal.Stoped += (sender, e) => { try { qpClient.Close(); } catch { } try { tcpClient.Close(); } catch { } }; portal.Start(); lock (portalDict) portalDict[portalModel] = portal; _ = beginAcceptTcpClient(); } catch { try { tcpClient?.Close(); } catch { } lock (portalDict) if (portalDict.ContainsKey(portalModel)) { portalDict.Remove(portalModel); } } }
private async void btnTest_Click(object sender, EventArgs e) { if (lvServers.SelectedItems.Count <= 0) { return; } var lvi = lvServers.SelectedItems[0]; var model = (Model.ServerModel)lvi.Tag; showLoading($"Testing server[{model.Url}]..."); var uri = new Uri(model.Url); QpClient client = null; try { switch (uri.Scheme) { case "tcp": client = new QpTcpClient(new QpTcpClientOptions() { Host = uri.Host, Port = uri.Port, Password = model.Password, EnableCompress = model.EnableCompress, EnableEncrypt = model.EnableEncrypt, InstructionSet = new[] { TcpGuard.Core.Protocol.V1.Instruction.Instance } }); break; case "ws": client = new QpWebSocketClient(new QpWebSocketClientOptions() { Url = model.Url, Password = model.Password, EnableCompress = model.EnableCompress, EnableEncrypt = model.EnableEncrypt, InstructionSet = new[] { TcpGuard.Core.Protocol.V1.Instruction.Instance } }); break; } if (client == null) { throw new ApplicationException($"Unknown Url:{model.Url}"); } await client.ConnectAsync(); var rep = await client.SendCommand(new GetVersionCommand()); if (rep.Code != 0) { throw new ApplicationException("Get server verion error,reason:" + rep.Message); } var serverVersion = rep.Data; var clientVersion = this.GetType().Assembly.GetName().Version; if (clientVersion != serverVersion) { throw new ApplicationException($"Client[{clientVersion}] and server[{serverVersion}] version not match."); } client.Close(); MessageBox.Show("Test success.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show("Test failed.Reason:" + ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); } closeLoading(); }