用DotRas来连接VPN网络
最近要用程序来不断的连接VPN(为什么要这样就不讨论了),开始用的是如下代码:
public static bool ADSL() { bool flag = true; do { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm") + " 重新拨号..."); Disconnect(ConfigurationManager.AppSettings["AdslName"]); Thread.Sleep(); Connect(ConfigurationManager.AppSettings["AdslName"], ConfigurationManager.AppSettings["Adsl"], ConfigurationManager.AppSettings["Pwd"]); Thread.Sleep(); flag = PingIpOrDomainName("www.baidu.com"); } while (!flag); return flag; } public static bool PingIpOrDomainName(string strIpOrDName) { try { Ping objPingSender = new Ping(); PingOptions objPinOptions = new PingOptions(); objPinOptions.DontFragment = true; string data = ""; byte[] buffer = Encoding.UTF8.GetBytes(data); ; PingReply objPinReply = objPingSender.Send(strIpOrDName, intTimeout, buffer, objPinOptions); string strInfo = objPinReply.Status.ToString(); if (strInfo == "Success") { return true; } else { return false; } } catch (Exception) { return false; } } public static string InvokeCmd(string cmdArgs) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.WriteLine(cmdArgs); p.StandardInput.WriteLine("exit"); return p.StandardOutput.ReadToEnd(); } public static void Connect(string connectionName, string user, string pass) { string arg = string.Format("rasdial \"{0}\" {1} {2}", connectionName, user, pass); InvokeCmd(arg); } public static void Disconnect(string connectionName) { string arg = string.Format("rasdial \"{0}\" /disconnect", connectionName); InvokeCmd(arg); }
这个类在平时也是能用,问题就在我需要不断的循环(连接-执行业务-断开-连接-执行业务-断开),而且频率还很高。在连接以后ping下baidu.com是否连接成功!但很多次都提示ping不上baidu.com,平时用的时候ping不上,就重新连接,倒也是可以的。
但最近需要连VPN,决定重新写这些方法,在网上啪啦啪啦好久,用上了DotRas:http://dotras.codeplex.com/
并且根据Demo,写了个辅助类DialerHelper:
public class DialerHelper { public RasHandle handle { get; set; } public string VPNIP { get; set; } // VPN名称 public string EntryName { get; set; } // VPN用户名 public string UserName { get; set; } // VPN密码 public string PassWord { get; set; } private RasPhoneBook _phoneBook; public RasPhoneBook PhoneBook { get { if (_phoneBook == null) _phoneBook = new RasPhoneBook(); return _phoneBook; } set { _phoneBook = value; } } private RasDialer _dialer; public RasDialer Dialer { get { if (_dialer == null) _dialer = new RasDialer(); return _dialer; } set { _dialer = value; } } public DialerHelper() { } /// <summary> /// 带参构造函数 /// </summary> /// <param name="_vpnIP"></param> /// <param name="_vpnName"></param> /// <param name="_userName"></param> /// <param name="_passWord"></param> public DialerHelper(string _vpnIP, string _entryName, string _userName, string _passWord) { this.VPNIP = _vpnIP; this.EntryName = _entryName; this.UserName = _userName; this.PassWord = _passWord; } /// <summary> /// 创建VPN /// </summary> public void CreateEntry() { CreateEntry(this.EntryName, VPNIP); } /// <summary> /// 创建VPN /// </summary> /// <param name="VPNName"></param> /// <param name="VPNIP"></param> public void CreateEntry(string VPNName,string VPNIP) { // This opens the phonebook so it can be used. Different overloads here will determine where the phonebook is opened/created. this.PhoneBook.Open(); // Create the entry that will be used by the dialer to dial the connection. Entries can be created manually, however the static methods on // the RasEntry class shown below contain default information matching that what is set by Windows for each platform. RasEntry entry = RasEntry.CreateVpnEntry(VPNName, IPAddress.Loopback.ToString(), RasVpnStrategy.Default, RasDevice.GetDeviceByName("(PPTP)", RasDeviceType.Vpn)); entry.PhoneNumber = VPNIP; // Add the new entry to the phone book. this.PhoneBook.Entries.Add(entry); } /// <summary> /// 连接 /// </summary> public bool ConnectEntry() { return ConnectEntry(UserName, PassWord); } /// <summary> /// 连接 /// </summary> /// <param name="sender">The object that raised the event.</param> /// <param name="e">An <see cref="System.EventArgs"/> containing event data.</param> private bool ConnectEntry(string _userName, string _passWord) { // This button will be used to dial the connection. this.Dialer.EntryName = EntryName; this.Dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); try { // Set the credentials the dialer should use. this.Dialer.Credentials = new NetworkCredential(UserName, PassWord); // NOTE: The entry MUST be in the phone book before the connection can be dialed. // Begin dialing the connection; this will raise events from the dialer instance. handle = this.Dialer.Dial(); return true; } catch (Exception ex) { return false; //this.StatusTextBox.AppendText(ex.ToString()); } } /// <summary> /// 连接 /// </summary> public void ConnectEntryAsync() { ConnectEntryAsync(UserName, PassWord); } /// <summary> /// 连接 /// </summary> /// <param name="sender">The object that raised the event.</param> /// <param name="e">An <see cref="System.EventArgs"/> containing event data.</param> private void ConnectEntryAsync(string _userName, string _passWord) { // This button will be used to dial the connection. this.Dialer.EntryName = EntryName; this.Dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); try { // Set the credentials the dialer should use. this.Dialer.Credentials = new NetworkCredential(UserName, PassWord); // NOTE: The entry MUST be in the phone book before the connection can be dialed. // Begin dialing the connection; this will raise events from the dialer instance. handle = this.Dialer.DialAsync(); } catch (Exception ex) { //this.StatusTextBox.AppendText(ex.ToString()); } } /// <summary> /// /// </summary> public void DisconnectEntry() { if (this.Dialer.IsBusy) { // The connection attempt has not been completed, cancel the attempt. this.Dialer.DialAsyncCancel(); } else { // The connection attempt has completed, attempt to find the connection in the active connections. RasConnection connection = RasConnection.GetActiveConnectionByHandle(this.handle); if (connection != null) { // The connection has been found, disconnect it. connection.HangUp(); } } } }
用DotRas来连接VPN网络的更多相关文章
- Windows 8 应用商店无法连接到网络的终极完美解决方案
当你看到以下几个步骤的时候,你可能会不以为然,因为你已经试过了,还是没成功,依然提示"你的电脑没有连接到Internet或者现在无法使用Windows应用商店,要使用Windows应用商店, ...
- 解决连接VPN后无法上网问题
解决连接VPN后无法上网问题 VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.顾名思义,虚拟专用网络可以把它理解成是虚拟出来的企业内部专线. 在公司 ...
- 如何处理Win7连接vpn时报错789的问题
[转]VPN错误提示: vpn连接出错789:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇 (2014-08-11 15:09:10)转载▼标签: it xp连接VPN错误提示: v ...
- 【Win10 应用开发】扫描和连接Wi-fi网络
老周今天带大家去“扫雷”了,别当真,是扫描并连接指定无线网络,时尚一点叫Wi-fi. 所以,今天的任务要求你的设备至少有1张无线网卡,目前老周没看到过有N张无线网卡的设备.像笔记本.平板等设备都可以, ...
- 解决OS X系统连接VPN后无法访问内网资源的问题
该问题是第一次使用OS X系统连接VPN遇到的问题,现象是连接VPN成功,但无法访问公司的内网资源. 主要原因还是VPN设置上的问题,在系统偏好设置中打开VPN连接,里面有个高级设置,如图: 点击高级 ...
- 双系统下(Ubuntu + win7)windows 无法连接无线网络
双系统下(Ubuntu + win7)windows 无法连接无线网络 今天开机登录win7,突然发现无法使用无线网络(WiFi信号标志有个大红叉),于是查看设备驱动,一切正常,这就奇怪了:用Wind ...
- linux开机自动连接无线网络
1.右击无线网络图标的“编辑连接”. 2.在“无线”选项卡里,选择“编辑”. 3.在“无线安全性”选项卡里,输入无线密匙,并选中左下角的“对所有用户可 用”的选项点击应用,会提 ...
- 「ubuntu」通过无线网络安装Ubuntu Server,启动系统后如何连接无线网络
接触Ubuntu系统不久,发现无线网络环境下安装Ubuntu Server一个不太人性化的设计:在安装过程中选择无线网卡,即使用无线网络安装(此时需要选择Wi-Fi网络并输入密码),但系统安装完成重启 ...
- 记在centos中连接无线网络的一次过程
1. 首先, 你的系统要能驱动无限网卡, 要是人品好的话, 系统已经自带了你的网卡的驱动程序. 不然就要先搞定无线网卡的驱动再说. 不然后面的步骤也就没必要了. 2. 看一下你的无线网卡叫什么: iw ...
随机推荐
- SVN和Git的一些用法总结
(A)SVN (1)查看日志提交的时候一般会写上注释,如果要查看提交日志,用以下命令: 1 svn log -l 4 其中,-l 4表示只查看最近4条日志(也可以没有这样的参数,就表示查看所有日志). ...
- Chrome Timeline的指标说明:Blocked、Connect、Send、Wait、Receive
Blocked time includes any pre-processing time (such as cache lookup) and the time spent waiting for ...
- 为什么ajax 必须同源,same origin policy
ajax 所有请求都会附带主域的cookie, 若没有同源策略,攻击者就可以获取你的cookie,状态.
- 使用YUIDoc生成JS文档
其实YUIDoc主页已经写的比较清晰了,但有一些概念和细节再点出一些注意的地方. 目前最新的YUIDoc使用nodejs进行开发安装和使用都非常的方便. 我们只需要将我们的代码加上必要的注释,便可以很 ...
- Zepto 使用中的一些注意点(转)
http://www.zeptojs.cn/ zepto英文站在线文档 http://www.css88.com/doc/zeptojs_api/ zepto中文站在线文档 htt ...
- bmp图片显示
文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...
- "类型初始值设定项引发异常"
问题出现的原因:在对类中的字段或属性直接赋值的时候出现异常而造成的这个异常. 例如: class MyClass { public static string ConnectionString = G ...
- IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口
IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口 背景: 最近公司有一个项目要上线,需要用到iis和tomcat整合,共用80端口.由于公司的数据都非常重要,只通过端口映射到外网的8 ...
- JavaScript 模拟策略模式
/** * 模拟一个接口,其方法会抛出异常: */ function FlyInter () {} FlyInter.prototype.fly = function() { throw '实现这个接 ...
- tomcat服务器搭建之ngrok——将内网地址映射到外网
最近心血来潮,想学习微信公众号开发.但是自己又没有外网服务器,这个给我带来很大的麻烦. 刚开始申请了新浪云服务和百度云服务,将写好的代码打包丢到相应的云服务器上就行. 但问题就来了,开发中避免不了错误 ...