好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C# 实现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);

   }

}

调用方法:

?

RASDisplay ras = new RASDisplay();

ras.Disconnect(); //断开连接

ras.Connect( "ADSL" ); //重新拨号

注意:断开后连接时,如果不想出现确认对话框,请按下面的步骤进行设置:

1、右击[网上邻居]--属性;

2、在随后出现的[宽带连接]窗口中,右击宽带连接,单击[属性];

3、在随后出现的属性对话框中,单击[选项];

4、把随后出现的[提示名称、密码和证书等]前面的对号去掉,点[确定]退出;

以上这篇C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

dy("nrwz");

查看更多关于C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)的详细内容...

  阅读:46次