• 使用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");//重新拨号
  • 相关阅读:
    【并发编程】安全发布对象
    【并发编程】并发的学习步骤
    特殊字符
    【并发编程】【JDK源码】CAS与synchronized
    【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
    【JDK源码】将JDK源码导入IDEA中
    【Linux命令】用户及分用户组
    【Linux命令】linux一次性解压多个.gz或者.tar.gz文件
    悟透JavaScript
    设计模式------工厂模式和抽象工厂模式
  • 原文地址:https://www.cnblogs.com/guozk/p/1705951.html
Copyright © 2020-2023  润新知