C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)

所属分类: 软件编程 / C#教程 阅读数: 164
收藏 0 赞 0 分享

封装类:

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

以上这篇C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多