使用C#实现ADSL自动拨号

    在网络编程中,有时候会需要重新拨号建立网络连接(如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( nullnull, 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( nullnull, 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"); //重新拨号

你可能感兴趣的:(DSL)