C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)
程序员文章站
2022-03-26 08:34:55
封装类:
using system;
using system.runtime.interopservices;
public struct rascon...
封装类:
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自动断网和拨号的方法(适用于拨号用户)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。