使用C#实现ADSL自动拨号

时间:2021-05-02

在网络编程中,有时候会需要重新拨号建立网络连接(如Ad点击软件通过重新拨号形成有效点击) ,下面介绍两种程序中拨号的方法.

1、最简单的方法:使用RasDialming令

RasDial是Windows自带的ming令,使用非常简单。实际使用是可将下面代码保存为一个批处理文件,然后直接运行或在程序里进行调用。

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 dataref int lpcb, // size in bytes of bufferref 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 NULLstring lpszPhonebook, // pointer to full path and// file name of phone-book file [In, Out]RasEntryName[] lprasentryname, // buffer to receive// phone-book entriesref int lpcb, // size in bytes of bufferout 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, reflpcConnections);

if (nRet != 0){m_connected = false;return;}

if (lpcConnections > 0){//for (int i = 0; i < lpcConnections; i++)//{

names.dwSize = entryNameSize;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 againif (lpNames > 1){names = new RasEntryName[lpNames];for (int i = 0; i < names.Length; i++){names.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 = names.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"); //重新拨号

本文源自:翔宇亭——IT乐园(http://),转载请保留此信息!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章