/// <summary> /// 是否连接上VPN服务器 /// </summary> /// <param name="vpnAccount">VPN服务器供应账号信息</param> /// <param name="vpnServer">VPN服务器信息</param> /// <returns>返回连接结果</returns> public bool IslinkVpnServer(MVPNAccount vpnAccount, MVPNServer vpnServer) { bool linkResult = false; VpnHelper = new VPNHelper(vpnServer.Address, vpnServer.Area + vpnServer.Line, VpnAccount.Account, VpnAccount.Password); bool createOrUpdateResult = VpnHelper.CreateOrUpdateVPN(); if (createOrUpdateResult) { ////连接VPN linkResult = VpnHelper.TryConnectVPN(); if (linkResult) { DateTime startTime = DateTime.Now; string testLinkInfo = new TestLink().GetPingStr("www.baidu.com", 32, 200, 3); if (testLinkInfo.Contains("100% 丢失")) { ////访问超时,也认为IP不可用 ////记录交互日志 string request = "VPN通道名称:" + vpnServer.Area + vpnServer.Line + ";VPN账号:" + vpnAccount.Account; RecordLog.RecordInteractionLog(vpnAccount.Account, "连接VPN成功后,测试请求外网", request, testLinkInfo, DateTime.Now.Subtract(startTime), vpnServer.Address); linkResult = false; } MessagePipe.ExcuteWriteMessageEvent(testLinkInfo, Color.Green, false); } } return(linkResult); }
/// <summary> /// 更新VPN状态 /// </summary> /// <param name="vpnServer">vpnServer</param> /// <returns>返回更新结果</returns> public bool ExitUpdateVpnIsValid(MVPNServer vpnServer) { IVPNServer ivpnServer = Better517Na.VPNDataService.Factory.DALFactory.GetVpnServerDal(Better517Na.VPNDataService.Factory.DBOperType.write); MModelBase mmb = new MModelBase(); mmb.AddConditionFields("KeyID", vpnServer.KeyID); mmb.AddUpdateFields("IsUsing", 0); mmb.AddUpdateFields("IsUsingDesc", "未使用"); mmb.AddUpdateFields("UsingServer", string.Empty); return ivpnServer.Update<MVPNServer>(vpnServer, mmb) > 0; }
/// <summary> /// 更新VPN状态 /// </summary> /// <param name="vpnServer">vpnServer</param> /// <returns>返回更新结果</returns> public bool ExitUpdateVpnIsValid(MVPNServer vpnServer) { IVPNServer ivpnServer = Better517Na.VPNDataService.Factory.DALFactory.GetVpnServerDal(Better517Na.VPNDataService.Factory.DBOperType.write); MModelBase mmb = new MModelBase(); mmb.AddConditionFields("KeyID", vpnServer.KeyID); mmb.AddUpdateFields("IsUsing", 0); mmb.AddUpdateFields("IsUsingDesc", "未使用"); mmb.AddUpdateFields("UsingServer", string.Empty); return(ivpnServer.Update <MVPNServer>(vpnServer, mmb) > 0); }
/// <summary> /// 更新VPN使用状态 /// </summary> /// <param name="vpnServer">vpnServer</param> /// <returns>返回更新结果</returns> public bool UpdateVpnUseStatu(MVPNServer vpnServer) { IVPNServer ivpnServer = Better517Na.VPNDataService.Factory.DALFactory.GetVpnServerDal(Better517Na.VPNDataService.Factory.DBOperType.write); MModelBase mmb = new MModelBase(); mmb.AddConditionFields("KeyID", vpnServer.KeyID); mmb.AddUpdateFields("IsUsing", 1); mmb.AddUpdateFields("IsUsingDesc", "使用中"); mmb.AddUpdateFields("UsingServer", new GetIP().GetLocalIp("本地连接")); return(ivpnServer.Update <MVPNServer>(vpnServer, mmb) > 0); }
/// <summary> /// 重写方法 /// </summary> protected override void ExcuteMethod() { while (true) { try { bool isneedLock = true; MessagePipe.ExcuteWriteMessageEvent("517VPN客户端启动成功", Color.Green, false); VpnInfo vpnInfo = new VpnInfo(); ////获取账号 this.GetVpnAccount(ref isneedLock); if (VpnAccount != null && !string.IsNullOrEmpty(VpnAccount.KeyID)) { MessagePipe.ExcuteWriteMessageEvent("517VPN客户端获取到账号" + VpnAccount.Account, Color.Green, false); ////马上锁定账号,锁定成功过,才允许使用这个账号 bool lockAccountResult = vpnInfo.UpdateVpnAccountState(VpnAccount); if (lockAccountResult || !isneedLock) { MessagePipe.ExcuteShowAccountInfoEvent(VpnAccount.Account); MessagePipe.ExcuteWriteMessageEvent("517VPN客户端锁定账号:" + VpnAccount.Account + "成功", Color.Green, false); ////清空一下加载的数据 MessagePipe.ExcuteDelVpnServerInfoEvent("clear"); ////加载出所有可用的VPN服务器信息,先拿使用服务器为本机的IP List<MVPNServer> tempExceptionVpn = vpnInfo.GetLocalUsedVpnServer(VpnAccount.Provider); ProductVpnServers.AddRange(tempExceptionVpn); List<MVPNServer> tempValidVpn = this.GetAllValidVpnServer(VpnAccount.Provider); ProductVpnServers.AddRange(tempValidVpn); ////因为有可能因为异常退出,导致IP一直被占用,所以首先取使用IP为自己服务器的IP if (ProductVpnServers != null && ProductVpnServers.Count > 0) { MessagePipe.ExcuteBindVpnServerInfoEvent(ProductVpnServers); ////锁定成功,取一个可用的VPN服务器建立连接(人工切换IP会有影响,) foreach (var tempVpn in ProductVpnServers) { TrackID.GetInstance("517VPN"); ////////接收到暂停指令 ////if (SignalControl.Issuspend) ////{ //// ////等待解锁指令 //// SignalControl.WaitSignal.WaitOne(); ////} VpnServer = tempVpn; MessagePipe.ExcuteShowIpInfoEvent(tempVpn.Address); MessagePipe.ExcuteShowLinkInfoEvent("连接中..."); ////IP独占成功,方可连接 if (vpnInfo.UpdateVpnUseStatu(tempVpn) || tempVpn.UsingServer == new GetIP().GetLocalIp("本地连接")) { string msg = string.Empty; bool connectResult = this.IslinkVpnServer(VpnAccount, tempVpn); if (connectResult) { MessagePipe.ExcuteWriteMessageEvent("517客户端连接VPN:" + tempVpn.Address + "成功", Color.Green, false); MessagePipe.ExcuteShowLinkInfoEvent("连接成功"); ////建立连接成功过后,调用业务组件,如果业务组件需要更换VPN服务器,则删除现有连接,重新建立新连接 bool result = this.InvokeIpMonitor(); if (result) { ////需要替换IP,还原数据状态 vpnInfo.UpdateVpnIsValid(tempVpn); MessagePipe.ExcuteWriteMessageEvent("检测到" + tempVpn.Address + "被封,需要替换IP", Color.Green, false); } } else { msg = tempVpn.Provider + "|" + tempVpn.Address; vpnInfo.UpdateVpnLinkStatu(tempVpn); MessagePipe.ExcuteWriteMessageEvent(msg + "连接失败", Color.Red, false); } msg = tempVpn.Provider + "|" + tempVpn.Address; MessagePipe.ExcuteDelVpnServerInfoEvent(msg); ////连接失败,删除连接 if (VpnControlThread.VpnHelper != null) { ////退出之前关闭VPN bool disConnectResult = VpnControlThread.VpnHelper.TryDisConnectVPN(); VpnControlThread.VpnHelper.TryDeleteVPN(); MessagePipe.ExcuteShowLinkInfoEvent("未连接"); } } } ////表明这一轮可用IP已经使用完了,所以清空一下 ProductVpnServers.Clear(); } } else { MessagePipe.ExcuteWriteMessageEvent("517VPN客户端没有锁定到账号,休眠40秒", Color.Red, true); ////锁定失败,休眠一分钟 Thread.Sleep(TimeSpan.FromSeconds(40)); } } else { MessagePipe.ExcuteWriteMessageEvent("517VPN客户端没有获取到账号,休眠40秒", Color.Red, true); ////锁定失败,休眠一分钟 Thread.Sleep(TimeSpan.FromSeconds(40)); } } catch (Exception ex) { LogManager.Log.WriteException(new AppException("517VPN客户端主流程异常", ex, ExceptionLevel.Error)); MessagePipe.ExcuteWriteMessageEvent("517VPN主流程异常" + ex.Message.ToString(), Color.Red, false); } finally { Thread.Sleep(TimeSpan.FromSeconds(1)); } } }
/// <summary> /// 是否连接上VPN服务器 /// </summary> /// <param name="vpnAccount">VPN服务器供应账号信息</param> /// <param name="vpnServer">VPN服务器信息</param> /// <returns>返回连接结果</returns> public bool IslinkVpnServer(MVPNAccount vpnAccount, MVPNServer vpnServer) { bool linkResult = false; VpnHelper = new VPNHelper(vpnServer.Address, vpnServer.Area + vpnServer.Line, VpnAccount.Account, VpnAccount.Password); bool createOrUpdateResult = VpnHelper.CreateOrUpdateVPN(); if (createOrUpdateResult) { ////连接VPN linkResult = VpnHelper.TryConnectVPN(); if (linkResult) { DateTime startTime = DateTime.Now; string testLinkInfo = new TestLink().GetPingStr("www.baidu.com", 32, 200, 3); if (testLinkInfo.Contains("100% 丢失")) { ////访问超时,也认为IP不可用 ////记录交互日志 string request = "VPN通道名称:" + vpnServer.Area + vpnServer.Line + ";VPN账号:" + vpnAccount.Account; RecordLog.RecordInteractionLog(vpnAccount.Account, "连接VPN成功后,测试请求外网", request, testLinkInfo, DateTime.Now.Subtract(startTime), vpnServer.Address); linkResult = false; } MessagePipe.ExcuteWriteMessageEvent(testLinkInfo, Color.Green, false); } } return linkResult; }
/// <summary> /// 更新VPN使用状态 /// </summary> /// <param name="vpnServer">vpnServer</param> /// <returns>返回更新结果</returns> public bool UpdateVpnUseStatu(MVPNServer vpnServer) { IVPNServer ivpnServer = Better517Na.VPNDataService.Factory.DALFactory.GetVpnServerDal(Better517Na.VPNDataService.Factory.DBOperType.write); MModelBase mmb = new MModelBase(); mmb.AddConditionFields("KeyID", vpnServer.KeyID); mmb.AddUpdateFields("IsUsing", 1); mmb.AddUpdateFields("IsUsingDesc", "使用中"); mmb.AddUpdateFields("UsingServer", new GetIP().GetLocalIp("本地连接")); return ivpnServer.Update<MVPNServer>(vpnServer, mmb) > 0; }