你的位置:首页 > ASP.net教程

[ASP.net教程]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、把随后出现的“提示名称、密码和证书等”前面的对号去掉,点“确定”退出;