当前位置: 代码迷 >> C# >> C# 实现ADSL自动断网跟拨号(适用于拨号用户)
  详细解决方案

C# 实现ADSL自动断网跟拨号(适用于拨号用户)

热度:19   发布时间:2016-05-05 03:04:25.0
C# 实现ADSL自动断网和拨号(适用于拨号用户)

封装类:

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");//重新拨号

 

注意:断开后连接时,如果不想出现确认对话框,请按下面的步骤进行设置:

1、右击“网上邻居”--属性;
2、在随后出现的“宽带连接”窗口中,右击宽带连接,单击“属性”;
3、在随后出现的属性对话框中,单击“选项”;
4、把随后出现的“提示名称、密码和证书等”前面的对号去掉,点“确定”退出;