c# 实现连接和断开宽带的拨号程序

ADSL自动拨号类,前提是在系统中已经有了一个宽带拨号连接  
  调用代码:  

  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(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);  
          }  
  }

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

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

  在c#中实现ADSL拨号连接有两种方法:

1、使用windows的api函数来实现(当然是RAS函数)。// 上面的代码

2、调用windows的拨号连接来实现。这两种方式各有利弊:方法一中有用户拨号界面的开发,方法二则不需要,下面是方法二的实现,实现的原理是在另一进程中调用windows的rasphone.exe。

rasphone是windows的拨号连接程序。
    using System.Diagnostics; //先引入namespace
    using Microsoft.Win32;
    //从注册表中取出系统可用的拨号连接
     RegistryKey UserKey = Registry.CurrentUser;
     RegistryKey Key = UserKey.OpenSubKey(@"RemoteAccess/Profile");
     string[] KeysList = Key.GetSubKeyNames();
     string  Connection=KeysList[0];  //这里假设只有一个拨号连接,也许有多个了,Connection变量下面用.

//1.得到rasphone.exe的全路径
    string WinDir = Environment.GetFolderPath(Environment.SpecialFolder.System);
    string file = @"/rasphone.exe ";
    string FileName = WinDir + file;
    //2.在进程中调用,变量Connection为windows中的adsl连接的名称,在网上邻居-> 属性中可以看到,也就是上面取到的
    string args="";
    args = "-d " +"/"" + Connection +"/"";   //注意当连接时用这句
   // args = "-h " +"/"" + Connection + "/""; //注意当断开时用这句
    Process myProcess = new Process();
    ProcessStartInfo Adsl = new ProcessStartInfo();
    Adsl.FileName = FileName;
    myProcess.StartInfo = Adsl;
    Adsl.Arguments = args;
    myProcess.Start();
    这样就会出现拨号连接的窗口。

 rasphone的用法可以用rasphone -h 看到。
    在好多地方看到可以用rasphone "-ld " +"/"" + Connection +"/""  实现自动拨号,但是我测试却报如下的错误,不知为何?

出现拨号连接的窗口是不会自动拨号的,实现此处的自动拨号在后面研究!

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

class AutoDialer
{
public void Connect(string connectionName, string user, string pass)
{
string arg = string.Format("rasdial /"{0}/" {1} {2}", connectionName, user, pass);
InvokeCmd(arg);
}

public void Disconnect(string connectionName)
{
string arg = string.Format("rasdial /"{0}/" /disconnect", connectionName);
InvokeCmd(arg);
}

private static string InvokeCmd(string cmdArgs)
{
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 = true;
p.Start();

p.StandardInput.WriteLine(cmdArgs);
p.StandardInput.WriteLine("exit");

return p.StandardOutput.ReadToEnd();
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值