在网络编程中,有时候会需要重新拨号建立网络连接(如Ad点击软件通过重新拨号形成有效点击) ,下面介绍两种程序中拨号的方法.

1、最简单的方法:使用RasDial命令
    RasDial是Windows自带的命令,使用非常简单。实际使用是可将下面代码保存为一个批处理文件,然后直接运行或在程序里进行调用。

rasdial.exe  /disconnect '断开连接
del "C:\Documents and Settings\hyuqin\Cookies\*.*" /Q  '清除Cookie
rasdial.exe  连接名 连接账户 连接密码 '重新拨号

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace LvChaNetwork
{
    public class ChangIp
    {
        /// <summary>
        /// 执行doc命令类
        /// </summary>

            /// <summary>
            /// 执行doc命令
            /// </summary>
            /// <param name="strOutput">要执行的doc命令</param>
            /// <param name="b">是否显示窗口</param>
            /// <returns>此返回值只表示doc命令是否执行(与执行成功与否无关)</returns>
            public static bool JS_cmd(string strOutput, bool b)
            {
                try
                {
                    Process p = new Process();
                    p.StartInfo.FileName = "cmd.exe";
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardInput = true;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.RedirectStandardError = true;
                    p.StartInfo.CreateNoWindow = b;
                    p.Start();
                    p.StandardInput.WriteLine(strOutput);
                    p.StandardInput.WriteLine("exit");
                    while (!p.StandardOutput.EndOfStream)
                    {
                        strOutput = p.StandardOutput.ReadLine();
                        Console.WriteLine(strOutput);
                    }
                    p.WaitForExit();
                    p.Close();
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
            /// <summary>
            /// 执行doc命令(默认不显示窗口)
            /// </summary>
            /// <param name="strOutput">要执行的doc命令</param>
            /// <returns>此返回值只表示doc命令是否执行(与执行成功与否无关)</returns>\
            public static bool JS_cmd(string strOutput)
            {
                return JS_cmd(strOutput, true);
            }
        }
}

 

用这个类调用上面的命令,就可以了 


2、封装为类,灵活调用
    上面提到的方法虽然很简单,但并非标准的实现方法,使用时会受到一些限制,此时最好的办法就是将实现代码封装为类库。下面这个类库是网上一位朋友提供的,直接调用就行.

adsl换ipusing System;
adsl换ipusing System.Runtime.InteropServices;
adsl换ip
adsl换ippublic struct RASCONN
adsl换ip{
adsl换ip    public int dwSize;
adsl换ip    public IntPtr hrasconn;
adsl换ip    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
adsl换ip    public string szEntryName;
adsl换ip    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
adsl换ip    public string szDeviceType;
adsl换ip    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
adsl换ip    public string szDeviceName;
adsl换ip}
adsl换ip
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
adsl换ippublic struct RasStats
adsl换ip{
adsl换ip    public int dwSize;
adsl换ip    public int dwBytesXmited;
adsl换ip    public int dwBytesRcved;
adsl换ip    public int dwFramesXmited;
adsl换ip    public int dwFramesRcved;
adsl换ip    public int dwCrcErr;
adsl换ip    public int dwTimeoutErr;
adsl换ip    public int dwAlignmentErr;
adsl换ip    public int dwHardwareOverrunErr;
adsl换ip    public int dwFramingErr;
adsl换ip    public int dwBufferOverrunErr;
adsl换ip    public int dwCompressionRatioIn;
adsl换ip    public int dwCompressionRatioOut;
adsl换ip    public int dwBps;
adsl换ip    public int dwConnectionDuration;
adsl换ip}
adsl换ip
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
adsl换ippublic struct RasEntryName
adsl换ip{
adsl换ip    public int dwSize;
adsl换ip    //[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName + 1)]
adsl换ip    public string szEntryName;
adsl换ip    //#if WINVER5
adsl换ip    //  public int dwFlags;
adsl换ip    //  [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)]
adsl换ip    //  public string szPhonebookPath;
adsl换ip    //#endif
adsl换ip}
adsl换ippublic class RAS
adsl换ip{
adsl换ip    [DllImport("Rasapi32.dll", EntryPoint = "RasEnumConnectionsA",
adsl换ip         SetLastError = true)]
adsl换ip
    internal static extern int RasEnumConnections
adsl换ip        (
adsl换ip        ref RASCONN lprasconn, // buffer to receive connections data
adsl换ip        ref int lpcb, // size in bytes of buffer
adsl换ip        ref int lpcConnections // number of connections written to buffer
adsl换ip        );
adsl换ip

adsl换ip    [DllImport("rasapi32.dll", CharSet = CharSet.Auto)]
adsl换ip    internal static extern uint RasGetConnectionStatistics(
adsl换ip        IntPtr hRasConn,       // handle to the connection
adsl换ip        [In, Out]RasStats lpStatistics  // buffer to receive statistics
adsl换ip        );
adsl换ip    [DllImport("rasapi32.dll", CharSet = CharSet.Auto)]
adsl换ip    public extern static uint RasHangUp(
adsl换ip        IntPtr hrasconn  // handle to the RAS connection to hang up
adsl换ip        );
adsl换ip
    [DllImport("rasapi32.dll", CharSet = CharSet.Auto)]
adsl换ip    public extern static uint RasEnumEntries(
adsl换ip        string reserved,              // reserved, must be NULL
adsl换ip        string lpszPhonebook,         // pointer to full path and
adsl换ip        //  file name of phone-book file
adsl换ip        [In, Out]RasEntryName[] lprasentryname, // buffer to receive
adsl换ip        //  phone-book entries
adsl换ip        ref int lpcb,                  // size in bytes of buffer
adsl换ip        out int lpcEntries             // number of entries written
adsl换ip        //  to buffer
adsl换ip        );
adsl换ip
    [DllImport("wininet.dll", CharSet = CharSet.Auto)]
adsl换ip    public extern static int InternetDial(
adsl换ip        IntPtr hwnd,
adsl换ip        [In]string lpszConnectoid,
adsl换ip        uint dwFlags,
adsl换ip        ref int lpdwConnection,
adsl换ip        uint dwReserved
adsl换ip        );
adsl换ip
    public RAS()
adsl换ip    {
adsl换ip    }
adsl换ip}
adsl换ippublic enum DEL_CACHE_TYPE //要删除的类型。
adsl换ip{
adsl换ip    File,//表示internet临时文件
adsl换ip    Cookie //表示Cookie
adsl换ip}
adsl换ip
public class RASDisplay
adsl换ip{
adsl换ip    [DllImport("wininet.dll", CharSet = CharSet.Auto)]
adsl换ip    public static extern bool DeleteUrlCacheEntry(
adsl换ip        DEL_CACHE_TYPE type
adsl换ip        );
adsl换ip    private string m_duration;
adsl换ip    private string m_ConnectionName;
adsl换ip    private string[] m_ConnectionNames;
adsl换ip    private double m_TX;
adsl换ip    private double m_RX;
adsl换ip    private bool m_connected;
adsl换ip    private IntPtr m_ConnectedRasHandle;
adsl换ip
    RasStats status = new RasStats();
adsl换ip    public RASDisplay()
adsl换ip    {
adsl换ip        m_connected = true;
adsl换ip
        RAS lpras = new RAS();
adsl换ip        RASCONN lprasConn = new RASCONN();
adsl换ip
        lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN));
adsl换ip        lprasConn.hrasconn = IntPtr.Zero;
adsl换ip
        int lpcb = 0;
adsl换ip        int lpcConnections = 0;
adsl换ip        int nRet = 0;
adsl换ip        lpcb = Marshal.SizeOf(typeof(RASCONN));
adsl换ip
        nRet = RAS.RasEnumConnections(ref lprasConn, ref lpcb, ref
adsl换ip            lpcConnections);
adsl换ip
        if (nRet != 0)
adsl换ip        {
adsl换ip            m_connected = false;
adsl换ip            return;
adsl换ip
        }
adsl换ip
        if (lpcConnections > 0)
adsl换ip        {
adsl换ip            //for (int i = 0; i < lpcConnections; i++)
adsl换ip
            //{
adsl换ip            RasStats stats = new RasStats();
adsl换ip
            m_ConnectedRasHandle = lprasConn.hrasconn;
adsl换ip            RAS.RasGetConnectionStatistics(lprasConn.hrasconn, stats);
adsl换ip

adsl换ip            m_ConnectionName = lprasConn.szEntryName;
adsl换ip
            int Hours = 0;
adsl换ip            int Minutes = 0;
adsl换ip            int Seconds = 0;
adsl换ip
            Hours = ((stats.dwConnectionDuration / 1000) / 3600);
adsl换ip            Minutes = ((stats.dwConnectionDuration / 1000) / 60) - (Hours * 60);
adsl换ip            Seconds = ((stats.dwConnectionDuration / 1000)) - (Minutes * 60) - (Hours * 3600);
adsl换ip

adsl换ip            m_duration = Hours + " hours " + Minutes + " minutes " + Seconds + " secs";
adsl换ip            m_TX = stats.dwBytesXmited;
adsl换ip            m_RX = stats.dwBytesRcved;
adsl换ip            //}
adsl换ip        }
adsl换ip        else
adsl换ip        {
adsl换ip            m_connected = false;
adsl换ip        }
adsl换ip

adsl换ip        int lpNames = 1;
adsl换ip        int entryNameSize = 0;
adsl换ip        int lpSize = 0;
adsl换ip        RasEntryName[] names = null;
adsl换ip
        entryNameSize = Marshal.SizeOf(typeof(RasEntryName));
adsl换ip        lpSize = lpNames * entryNameSize;
adsl换ip
        names = new RasEntryName[lpNames];
adsl换ip        names[0].dwSize = entryNameSize;
adsl换ip
        uint retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames);
adsl换ip
        //if we have more than one connection, we need to do it again
adsl换ip        if (lpNames > 1)
adsl换ip        {
adsl换ip            names = new RasEntryName[lpNames];
adsl换ip            for (int i = 0; i < names.Length; i++)
adsl换ip            {
adsl换ip                names[i].dwSize = entryNameSize;
adsl换ip            }
adsl换ip
            retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames);
adsl换ip
        }
adsl换ip        m_ConnectionNames = new string[names.Length];
adsl换ip

adsl换ip        if (lpNames > 0)
adsl换ip        {
adsl换ip            for (int i = 0; i < names.Length; i++)
adsl换ip            {
adsl换ip                m_ConnectionNames[i] = names[i].szEntryName;
adsl换ip            }
adsl换ip        }
adsl换ip    }
adsl换ip
    public string Duration
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_connected ? m_duration : "";
adsl换ip        }
adsl换ip    }
adsl换ip
    public string[] Connections
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_ConnectionNames;
adsl换ip        }
adsl换ip    }
adsl换ip
    public double BytesTransmitted
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_connected ? m_TX : 0;
adsl换ip        }
adsl换ip    }
adsl换ip    public double BytesReceived
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_connected ? m_RX : 0;
adsl换ip
        }
adsl换ip    }
adsl换ip    public string ConnectionName
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_connected ? m_ConnectionName : "";
adsl换ip        }
adsl换ip    }
adsl换ip    public bool IsConnected
adsl换ip    {
adsl换ip        get
adsl换ip        {
adsl换ip            return m_connected;
adsl换ip        }
adsl换ip    }
adsl换ip
    public int Connect(string Connection)
adsl换ip    {
adsl换ip        int temp = 0;
adsl换ip        uint INTERNET_AUTO_DIAL_UNATTENDED = 2;
adsl换ip        int retVal = RAS.InternetDial(IntPtr.Zero, Connection, INTERNET_AUTO_DIAL_UNATTENDED, ref temp, 0);
adsl换ip        return retVal;
adsl换ip    }
adsl换ip    public void Disconnect()
adsl换ip    {
adsl换ip        RAS.RasHangUp(m_ConnectedRasHandle);
adsl换ip    }
adsl换ip}


调用方法:

adsl换ipRASDisplay ras = new RASDisplay();
adsl换ipras.Disconnect();//断开连接
adsl换ipras.Connect("ADSL");//重新拨号

相关文章: