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

 

本文出自 “Running...” 博客,请务必保留此出处http://ssbird.blog.51cto.com/277690/56809

你可能感兴趣的:(DSL)