zoukankan      html  css  js  c++  java
  • 程序中自动拨号的方法

    网络程序员非常有必要了解如何自动拨号的种种方法,以便于自已在程序中控制网络连接。根据个人的经验总结,一般有以下方法技巧:

    1、调用Windows命令RasDial.exe(或RasPhone.exe),可以由Shell直接运行,也可由.bat或.VBS脚本运行

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

    2、调用WindowAPI函数InternetDial("wininet.dll")等
    3、调用别人已封装好的类库,如下就是网友封装的自动拨号类
    调用代码:
    RASDisplay ras = new RASDisplay();
    ras.Disconnect();
    //断线
    ras.Connect("adsl");//拨号
    自动拨号类:
    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);
        }

    }

    4、列出当前机器上所有网络连接,可以用上面的封装类,也可以直接查询注册表
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As IntegerByVal   lpSubKey As StringByRef phkResult As IntegerAs Integer 
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As IntegerAs Integer 
    Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As IntegerByVal   dwIndex As IntegerByVal lpName As StringByVal cbName As IntegerAs Integer 
      
    Const HKEY_CURRENT_USER As Integer = &H80000001 
      
    Const ERROR_NO_MORE_ITEMS As Short = 259 
      
    Const ERROR_SUCCESS As Short = 0 

      
    Dim hKey As Integer 
      
    Dim i As Integer 
      
    Dim astr As String = New String(""256
      
    If RegOpenKey(HKEY_CURRENT_USER, "RemoteAccess\Profile", hKey) = ERROR_SUCCESS Then 
        
    While RegEnumKey(hKey, i, astr, 256= ERROR_SUCCESS 
          
    MsgBox(astr)  '链接名称 
          i += 1 
        
    End While 
        RegCloseKey(hKey) 
      
    End If 

    '主要用到:
    '
    Registry.CurrentUser.OpenSubKey("RemoteAccess\Profile", True) 

  • 相关阅读:
    【洛谷P4137】Rmq Problem / mex【主席树】
    【洛谷P4168】蒲公英【分块】
    【洛谷P4168】蒲公英【分块】
    【POJ3422】Kaka's Matrix Travels【费用流】
    【POJ3422】Kaka's Matrix Travels【费用流】
    【USACO3.1】解题报告
    【USACO3.1】解题报告
    【USACO3.1.5】【洛谷P2724】联系 Contact【模拟】
    【USACO3.1.5】【洛谷P2724】联系 Contact【模拟】
    死锁
  • 原文地址:https://www.cnblogs.com/yuanbao/p/906440.html
Copyright © 2011-2022 走看看