用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 ...
随机推荐
- 那些年我们一起改过的bug
ORA-01861: 文字与格式字符串不匹配 ORA-00936: 缺失表达式 ORA-01810 格式代码出现两次 ORA-01722: 无效数字 无效的列索引
- 在vhd中安装win7,并建立分差vhd
准备:硬盘分区激活第一个分区; imagex.exe; install.wim; winpe boot pc 1.cmd命令下,创建主vhd (1)diskpart (打开dis ...
- 利用JS做到隐藏div和显示div
div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白 style="visibility: none;" document.getElementById( ...
- IE6下完美兼容css3圆角和阴影属性的htc插件PIE.htc
1.(推荐:)css插件PIE.htc,这个才是真正完美兼容css3的圆角和阴影属性在IE6环境下使用的效果,但要注意的是:下面的代码必须写在html文件的head标签内,否则无效(不能从外部引用下面 ...
- 升级wamp5集成安装包 php5.2到php5.3
平时xp下面都使用wamp5集成开发 但php的空间命名需要php5.3 才支持,而且公司系统大部分都使用5.3,很多函数与5.2是不同的 难的在xp下面手动安装,集成包使用很方便,配置,快捷键都很不 ...
- Delphi获取其它进程窗口句柄的3种方法
本文主要跟大家介绍Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如: handle ...
- 用fluent模拟内循环床气化燃烧(调试过程记录)
模拟对象为文献Combined gasification of coal and biomass in internal circulating fluidized bed[1]中的内循环气化炉.[1]h ...
- #搜索# #BFS# #优先队列# ----- OpenJudge鸣人和佐助
OpenJudge 6044:鸣人和佐助 总时间限制: 1000ms 内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐 ...
- IIS HTTP重定向到HTTPS
最近客户一个网站升级至HTTPS协议访问,但是为了用户输入,客户要求当用户输入的是HTTP协议时,能自动定向到HTTPS,类似百度网站,当你输入www.baidu.com并回车后,地址栏自动变成了ht ...
- mongo db 启动停止
1.下载压缩包,解压,bin目录放在path中: 2.cmd中输入mongod --dbpath d:\xx\yy\data 启动了 3.如果错误关闭,到d:\xx\yy\data中删除.lock文件 ...