使用C#实现ADSL自动拨号

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

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

 

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

 

 

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

 

ExpandedBlockStart.gif 代码
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 " ); // 重新拨号

 

 

 

 

转载于:https://www.cnblogs.com/guozk/archive/2010/04/07/1705951.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值