在网络编程中,有时候会需要重新拨号建立网络连接(如Ad点击软件通过重新拨号形成有效点击) ,下面介绍两种程序中拨号的方法.
1、最简单的方法:使用RasDial命令
RasDial是Windows自带的命令,使用非常简单。实际使用是可将下面代码保存为一个批处理文件,然后直接运行或在程序里进行调用。
rasdial.exe /disconnect '断开连接
del "C:\Documents and Settings\hyuqin\Cookies\*.*" /Q '清除Cookie
rasdial.exe 连接名 连接账户 连接密码 '重新拨号
2、封装为类,灵活调用
上面提到的方法虽然很简单,但并非标准的实现方法,使用时会受到一些限制,此时最好的办法就是将实现代码封装为类库。下面这个类库是网上一位朋友提供的,直接调用就行.
using System; using System.Runtime.InteropServices; public struct RASCONN { public int dwSize; public IntPtr hrasconn; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)] public string szEntryName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)] public string szDeviceType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] public string szDeviceName; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RasStats { public int dwSize; public int dwBytesXmited; public int dwBytesRcved; public int dwFramesXmited; public int dwFramesRcved; public int dwCrcErr; public int dwTimeoutErr; public int dwAlignmentErr; public int dwHardwareOverrunErr; public int dwFramingErr; public int dwBufferOverrunErr; public int dwCompressionRatioIn; public int dwCompressionRatioOut; public int dwBps; public int dwConnectionDuration; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RasEntryName { public int dwSize; //[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName + 1)] public string szEntryName; //#if WINVER5 // public int dwFlags; // [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)] // public string szPhonebookPath; //#endif } public class RAS { [DllImport("Rasapi32.dll", EntryPoint = "RasEnumConnectionsA", SetLastError = true)] internal static extern int RasEnumConnections ( ref RASCONN lprasconn, // buffer to receive connections data ref int lpcb, // size in bytes of buffer ref int lpcConnections // number of connections written to buffer ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] internal static extern uint RasGetConnectionStatistics( IntPtr hRasConn, // handle to the connection [In, Out]RasStats lpStatistics // buffer to receive statistics ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] public extern static uint RasHangUp( IntPtr hrasconn // handle to the RAS connection to hang up ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] public extern static uint RasEnumEntries( string reserved, // reserved, must be NULL string lpszPhonebook, // pointer to full path and // file name of phone-book file [In, Out]RasEntryName[] lprasentryname, // buffer to receive // phone-book entries ref int lpcb, // size in bytes of buffer out int lpcEntries // number of entries written // to buffer ); [DllImport("wininet.dll", CharSet = CharSet.Auto)] public extern static int InternetDial( IntPtr hwnd, [In]string lpszConnectoid, uint dwFlags, ref int lpdwConnection, uint dwReserved ); public RAS() { } } public enum DEL_CACHE_TYPE //要删除的类型。 { File,//表示internet临时文件 Cookie //表示Cookie } public class RASDisplay { [DllImport("wininet.dll", CharSet = CharSet.Auto)] public static extern bool DeleteUrlCacheEntry( DEL_CACHE_TYPE type ); private string m_duration; private string m_ConnectionName; private string[] m_ConnectionNames; private double m_TX; private double m_RX; private bool m_connected; private IntPtr m_ConnectedRasHandle; RasStats status = new RasStats(); public RASDisplay() { m_connected = true; RAS lpras = new RAS(); RASCONN lprasConn = new RASCONN(); lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN)); lprasConn.hrasconn = IntPtr.Zero; int lpcb = 0; int lpcConnections = 0; int nRet = 0; lpcb = Marshal.SizeOf(typeof(RASCONN)); nRet = RAS.RasEnumConnections(ref lprasConn, ref lpcb, ref lpcConnections); if (nRet != 0) { m_connected = false; return; } if (lpcConnections > 0) { //for (int i = 0; i < lpcConnections; i++) //{ RasStats stats = new RasStats(); m_ConnectedRasHandle = lprasConn.hrasconn; RAS.RasGetConnectionStatistics(lprasConn.hrasconn, stats); m_ConnectionName = lprasConn.szEntryName; int Hours = 0; int Minutes = 0; int Seconds = 0; Hours = ((stats.dwConnectionDuration / 1000) / 3600); Minutes = ((stats.dwConnectionDuration / 1000) / 60) - (Hours * 60); Seconds = ((stats.dwConnectionDuration / 1000)) - (Minutes * 60) - (Hours * 3600); m_duration = Hours + " hours " + Minutes + " minutes " + Seconds + " secs"; m_TX = stats.dwBytesXmited; m_RX = stats.dwBytesRcved; //} } else { m_connected = false; } int lpNames = 1; int entryNameSize = 0; int lpSize = 0; RasEntryName[] names = null; entryNameSize = Marshal.SizeOf(typeof(RasEntryName)); lpSize = lpNames * entryNameSize; names = new RasEntryName[lpNames]; names[0].dwSize = entryNameSize; uint retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames); //if we have more than one connection, we need to do it again if (lpNames > 1) { names = new RasEntryName[lpNames]; for (int i = 0; i < names.Length; i++) { names[i].dwSize = entryNameSize; } retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames); } m_ConnectionNames = new string[names.Length]; if (lpNames > 0) { for (int i = 0; i < names.Length; i++) { m_ConnectionNames[i] = names[i].szEntryName; } } } public string Duration { get { return m_connected ? m_duration : ""; } } public string[] Connections { get { return m_ConnectionNames; } } public double BytesTransmitted { get { return m_connected ? m_TX : 0; } } public double BytesReceived { get { return m_connected ? m_RX : 0; } } public string ConnectionName { get { return m_connected ? m_ConnectionName : ""; } } public bool IsConnected { get { return m_connected; } } public int Connect(string Connection) { int temp = 0; uint INTERNET_AUTO_DIAL_UNATTENDED = 2; int retVal = RAS.InternetDial(IntPtr.Zero, Connection, INTERNET_AUTO_DIAL_UNATTENDED, ref temp, 0); return retVal; } public void Disconnect() { RAS.RasHangUp(m_ConnectedRasHandle); } }
调用方法:
RASDisplay ras = new RASDisplay();
ras.Disconnect();//断开连接
ras.Connect("ADSL");//重新拨号
相关推荐
C#实现ADSL自动拨号 C#实现ADSL自动拨号 C#实现ADSL自动拨号 C#实现ADSL自动拨号
已经在win7中测试了可以用,在直接连接猫的情况下可以断线、拨号。 从网上各类代码中整合出来的。可以进行无窗口拨号
封装类: using System; using System.Runtime.InteropServices; public struct RASCONN { public int dwSize; public IntPtr hrasconn;... [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)] ...
C#自动拨号【ADSL】【源代码】,不错的源码
C# ,找到网上的事例都不怎么理想,为了使用方便,整合了一份相对简单实用 可以使用系统设置好的默认连接,也可以自己指定拨号账号进行连接 public int Connect() { RAS.RASDIALPARAMS RasDialParams = ...
在visual studio 2012中调试通过,可以成功使用宽带账号上网的程序源码。
C# 自动拨号 ADSL 整理了一下,VS2008编译通过,注意设置一下就可以了。
C#调用拨号连接的自动拨号程序,可用于测试adsl的拨号密码
C#写的拨号程序,可设口令置拨号间隔,拨号所用账号、口令等参数。
已经在win7中测试了可以用,在直接连接猫的情况下可以断线、拨号。从网上各类代码中整合出来的。可以进行无窗口拨号
C# ADSL 拨号投票软件 C# ADSL 拨号投票软件 C# ADSL 拨号投票软件
–StartFragment–>ADSL自动拨号类,前提是在系统中已经有了一个宽带拨号连接 调用代码: RASDisplay ras = new RASDisplay(); ras.Disconnect();//断线 ras.Connect(“adsl”);//拨号 代码如下:using System; ...
c# adsl拨号连接(winxp与win7系统都测试通过)
取宽带账号密码c++源码, cmd 宽带拨号,断开 ,mfc vs2015调试通过
摘要:C#源码,网络相关,拨号程序,ADSL 基于C#的ADSL拨号程序,自己定义一个拨号名称,输入已知的ADSL帐户名和密码,就可以尝试进行拨号,程序相对不太复杂,为了顺利编译项目文件,请在VS2008下运行这些文件。
备份密码 装机必备 方便重做系统之前备份本机ADSL拨号账号及密码,免得每次问多数忘记的用户,还得给宽带服务商打电话(那是个烦啊)。 pn'*w 1i ~|fd=E%
调用示例 string strError = ""; new RasApi().HangUp(XmlHelper.AdslName, out strError); bool fh = new RasApi().DialUp(XmlHelper.AdslName, XmlHelper.AdslUserName, XmlHelper.AdslPassWord, out strError);...
1: class AutoDialer 2: { 3: public void Connect(string connectionName, string user, string pass) 4: { 5: string arg = string.Format("rasdial \"{0}\" {1} {2}", connectionName, user, pass);...
这个软件是C#作品。虽然网上已经有很多同类的软件了,但是我都不满意,主要是因为他们把功能搞复 杂了。本来只是用来拨号的一个小软件而已。200多K的网速我想也没有几个人愿意共享使用。 说明: 1、软件的每个...