用代码控制网络断开与重连亚洲城误乐城ca88网站

来看这些题目,假若您想说谁会这样蛋疼,有网不地道上,那么注解您要么一个冰清玉洁的豆蔻年华。自动重拨的需要所在多有,紧假设为着绕过各大网站对同样IP地址的双重请求次数限制等等。具体的自我不说了,说多了说自己教坏小孩子。我近年研讨那多少个只是因为我想写个软件自动播放和下载某个网站的视频,but这些网站一天只让同个IP免费看六个录像,我又抠不愿意花钱,不过又特意想多看多载几部。什么,你要自我把网站地址告诉你?依旧算了吧,传播XX(se)OO(qing)是违纪的知晓不。

按常规,先表明:技术知识浩瀚无垠,笔者但求浅尝辄止便心满足足,所以,本文并不保证描述的准头,若有荒唐和不足之处请不吝赐教。

上网格局简介


趁此机会简单了然下各种网络连接格局。以下描述紧要缘于浅谈各类宽带上网的形式

拨号上网:20世纪90年代刚有互联网的时候,老百姓上网使用最为普便的一种方法是拨号上网。只要用户拥有一台个人电脑、一个外置或内置的调制解调器(Modem)和一根电话线,再向地点ISP供应商申请自己的账号,或进货上网卡,拥有和谐的用户名和密码后,然后通过拨打ISP的接入号连接到Internet上。这些时候,出差的人们时时会问饭店是否拨号上网,然后问拨什么号,之后以缓慢的速度发送邮件或“畅游”网络。拨号形式理论上的参天速率56KBIT/S。除了速度慢外,同时只可以进展一项工作,比如上网了电话就打不进入。

ISDN:准确地说应是N-ISDN,即窄带ISDN,它根本提供64kbit/s到2Mbit/s的交接能力、近来促进用户的ISDN业务是主导速率接口,即2B+D,每个B通道为64kbit/s,D通道为16kbit/s,ISDN在Internet接入方面比普通用户以56kbit/s的Modem上网具有无可比拟的优势。首先,由于ISDN提供了2B+D的法力,使得用户可以单方面以64kbit/s的速度上网,一面又可以而且使用另一通道打电话而互不苦恼,卓殊有利;其次,ISDN是数字式设备,因此接入速度分外快,不像Modem那样要有很长的确立即间,全数字的网络使建立只需几分钟;最终,由于ISDN提供2B+D格局,使得用户可以绑定多少个B通道上网,最高速率可达128kbit/s,比56k
Modem的过渡速率快2.2倍,真正可以完成网上冲浪。

ADSL:近几年最广大的网络相联情势。长时间以来通信用户的电话机经过”对绞铜线”的用户线连至市内交换局,进入国有互换的通信网(PSTN),接至对方用户的对讲机,使双方可以互会师话。对绞铜线为传统的效仿话机提供300~3400Hz
的频带,为了适应电话用户采纳低速数据通信,曾加装调制一解调器(modem),使速率33kb/s
和最高56kb/s
的数据信号可以透过模拟话音频带与对方进行数据通信。这就是拨号上网模式的根底。话音modem
只好提供56kb/s 的数额速率。为何对绞铜线只能传输以56kb/s
为限度的多少吧?应该说,这不是对绞铜线传输能力的底限,而是通信网中的交流机有限制,它对电话机通信只是分配一个口风频带。尽管用户的数量信息透过话音modem,交流机并不认出它是小说modem
传来的数据信号,而只是对它看作话消息号看待。对绞铜线本身并不限制定带数据信号的传输,只要避开窄带交换机,用户就可以把宽带数据信号送进通信网。由此大家说,用户线如避开了窄带的口吻交流机,就可改为”数字用户线”(DSL,Digital
Subscriber
Line)。简单地说,ADSL可以采纳现有的电话线网络,只要在线路两端加装ADSL设备,即可为用户提供高宽带服务,提供8MBIT/S的高速下行速率,远超出ISDN速率,而上行速率有1MBIT/S,是惯常电话机拔号MODEM的百倍以上,传输距离能达3-5KM。当然ADSL的商业化推进也通过了各地点多年的用力。有人会问,“我家用的就是ADSL,怎么每一回还要弹出一个拨号界面让我输入账号密码呢?”实际上,ADSL本身是不需要拨号的,而是一种专线链接。拨号的目标只是是申明用户的身价并展开计费,因而称为虚拟拨号。虚拟拨号需要用到虚拟拨号软件,常用的有WinPoET
,虚拟拨号软件在装置过程中会提醒将拨号绑定到与ADSL Modem
相连的网卡。配置好以后,拨号模式与56Kbps模拟Modem完全相同,在对话框里输入ISP提供的用户名和密码就可以了。ADSL还提到到PPPOE的概念,有空再研商吗。

光纤入户:很引人注目,最直观的分别就是传输介质不同,当然相关的联网技术一定也是例外的,网速比ADSL又有了很大升级,就不赘述了。笔者安装光纤时,电信也给了一个好像Modem的事物,工作人士也把它称作“猫”,其实和拨号情势用的Modem不是同个东西,可是精神依旧重点用来处理信号转换。

ISDN没接触过就隐瞒了,传统拨号和ADSL都得以透过调用拨号程序控制网络的断开与连接,倘使ADSL入户时接入到路由器上,那么可以通过重启路由器的方法开展IP更换。光纤入户时常也接路由器(光猫原本自带无线路由效用,不过有时电信会把这么些功效给锁掉让你用持续,很坑爹),不过账号和密码是保留在光猫里的,所以要重启的是光猫(似乎也有点子可以因此路由器举办拨号,笔者没探讨过)。重启路由器和光猫很粗略,调用设备管理页面的重启请求即可。上面我们首要讲哪些通过活动拨号举办网络重连。

RAS概述


现近日,社会已经离不了网络,企事业单位对网络的需求也在不断扩充,各地分支机构都急需与总部随时开展消息置换。即便经过Intemet能很好落实远程数据的传导,但需要总部与所在分支机构都拥有理想的上网条件和IP地址。在骨子里工作中,出于成本上的考虑,大多数中小型公司多拔取传统的通过调制解调器和电话线直接拨号的点子来促成长途数据的传导(并不一定经由Internet,更近乎于局域网)。

长途访问服务(Remote Access
seryice)利用国有交流电话网络(PSTN)把远离局域网(LAN)的处理器连接到局域网上来,远程总括机(RAS客户机)可以拿到LAN用户的具备服务和权限,并走访、共享该LAN上的资源。它所进行的网络互联架构,在提供网络互联的同时,能够集中公告各类应用程序,包括Web应用程序,以及几乎所有配置在台式机的应用程序。分析结果展现,维持RAS正常使用所急需的带宽至极低,用户端提供低于28Kbps连忙访问。绝对于传统的连网方案,
RAS提供了进一步便捷、安全、灵活和可管理的长距离应用接入方案,使人们得以随需应变,通过其它网络连接格局对集团展开随时随地的金昌访问,为公司的
ERP 、 CRM 、 OA
等消息运用系统完善提速。RAS适用于行业用户使用,如:集团办公室网络,政坛办公室网络、税收征收系统、电力系统、医疗领域等等。

远程访问服务支撑拨号网络(DUN)连接与虚拟专用网络(VPN)连接二种不同的中距离访问连接情势。拨号网络(DUN)连接就是远程客户机利用一个总是了电话线的调制解调器,通过拨号的不二法门呼叫远程总结机并建立连接。虚拟专用网络(VPN)是长距离客户机使用基于TCP/IP协议的特别隧道协议(如PPTP、L2TP),通过编造专用网络服务器的虚构端口,借助任何网络(如Intemet),实现一种逻辑上的第一手连接。

VPN属于远程访问技术,简单地说就是利用公用网络架构专用网络。例如某商店职工出差到外边,他想拜会集团内网的服务器资源,这种访问就属于远程访问。在价值观的小卖部网络布局中,要拓展长距离访问,传统的不二法门是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然造成高昂的网络通讯和维护费用。对于移动用户(移动办公人士)与远端个人用户而言,一般会由此拨号线路(Internet)进入店铺的局域网,但这样必然带来平安上的隐患。

让外地职工访问到内网资源,利用VPN的解决格局就是在内网中架设一台VPN服务器。外地职工在该地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入合作社内网。为了保证数据安全,VPN服务器和客户机之间的报导数据都开展了加密处理。有了数额加密,就足以认为数额是在一条专用的数目链路上拓展安全传输,就犹如专门架设了一个专用网络同样,但实际VPN使用的是互联网上的公用链路,因而VPN称为虚拟专用网络,其实质上就是运用加密技术在公网上包裹出一个数据通讯隧道。有了VPN技术,用户无论在异地出差要么在家庭办公,只要能上互联网就能使用VPN访问内网资源,这就是VPN在铺子中应用得这么大面积的因由。

P/Invoke


大家可以借助RASapi实现软件的机动拨号。RAS
APl最早是在windows for workgroup 3.11中出现的,现已变为win32
API的一个组成部分。RAS
API提供了专门用来落实RAS功用的函数,遵照其实际的职能分别寄存在API32.DLL、RASDLG.DLL和RASSAPI.DLL五个动态链接库中。其中,RASAPl32.DLL封装了RAS客户功用的函数,RASDLG.DLL封装了多少个基于对话框的功力函数,RASSAPI.DLL则封装了RAS
Server的部分管理函数。 

RAS
API将全体拨号网络视为RAS电话簿(Phonebook),而每一个一连视为电话簿条目(PhonebookEntry)。调用RasCreatePhonebookEntry成立新的连续,调用RasDial举办拨号,调用RasEnumEntries拿到当前系统已有些拥有连接,调用此外的RAS函数还足以分级实现获取或设置连接参数等成效。 

作为.NETer,偶尔要凭借P/Invoke调用Win32Api,以RASAPI中的主题函数RasDial.aspx)为例,看用C#什么样封装对该函数的调用。

还有个api名曰InternetDial.aspx),也能用来写拨号程序,就不清楚它和RasApi的区分有咋样。MSDN里说道InternetDial
does not support double-dial connections, SmartCard authentication, or
connections that require registry-based certification. Starting on
Windows Vista and Windows Server 2008, the WinINet dial-up functions use
the RAS functions to establish a dial-up connection. WinINet supports
the functionality documented in the RasDialDlg function.
所以我想前日依旧用RAS相比靠谱一点。

首先在MSDN中查看RasDial的概念如下:

DWORD RasDial(
  _In_   LPRASDIALEXTENSIONS lpRasDialExtensions,
  _In_   LPCTSTR lpszPhonebook,
  _In_   LPRASDIALPARAMS lpRasDialParams,
  _In_   DWORD dwNotifierType,
  _In_   LPVOID lpvNotifier,
  _Out_  LPHRASCONN lphRasConn
);

接下来我们要将Win32类型转为C#体系。由于 DWORD 是 4
字节的平头,由此我们得以动用 int 或 uint 作为 C# 对应类型。由于 int 是
CLS 兼容类型(可以用于所有 .NET 语言),以此比 uint
更常用,并且在大部情形下,它们中间的区分并不首要。以P或LP起头的类型一般都是指针,对应的C#花色需要为引用类型,假若作为参数使用,那么也可以拔取值类型,前面加上ref/out关键字即可;还有一种方法,就是应用CLR中的System.IntPrt作为万能指针去相应任意Win32指针类型,它从未要求一起来就定义对应的数据类型,后边用到时再予以即可(概念上稍微类似于Object)。不像系统中的其他基类型,IntPtr
并不曾永恒的大小。相反,它在运作时的轻重缓急是依底层操作系统的正规指针大小而定的。这表示在
32 位的 Windows 中,IntPtr 变量的幅度是 32 位的,而在 64 位的 Windows
中,实时编译器编译的代码会将 IntPtr 值看作 64
位的值。当在托管代码和非托管代码之间封送不透明指针时,这种活动调节高低的性状相当实用。

我们一贯常说的32位、64位系统,这里的位数其实指的是最大寻址空间,即内存的最大尺寸,也就是说使用32位操作系统帮助的内存也最多为2的32次方,就是4G。和数据类型占用的字节大小没有涉及。

RASDIALEXTENSIONS是指向一个结构的指针,定义如下:

typedef struct _RADIALEXTENSIONS {
  DWORD              dwSize;
  DWORD              dwfOptions;
  HWND               hwndParent;
  ULONG_PTR          reserved;
  ULONG_PTR          reserved1;
  RASEAPINFO         RasEapInfo;
  BOOL               fSkipPppAuth;
  RASDEVSPECIFICINFO RasDevSpecificInfo;
} RASDIALEXTENSIONS, *PRASDIALEXTENSIONS;

依据上述,在c#中大家得以采用class替代它,由于这么些社团是作为RasDial函数的一个参数传递,由此我们也足以应用struct替代,并在调用方法的时候在此参数前增长ref/out(若将参数作为一个一体化操作,那么class也亟须抬高ref/out,避免出实际参/形参引用不等同的情事),当然,在章程调用的时候,我们也得以动用System.IntPrt指向之,略微麻烦一点的是,IntPrt需要手动为其分配非托管内存并写入数据,所幸借助System.Runtime.InteropService(Service)s.马尔斯hal类的连锁方法,这部分干活也很简短。

c#代表如下(RASDIALEXTENSIONS最终多少个字段是Win7之后新增的,在编码的时候要注意):

        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        public struct RASDIALEXTENSIONS
        {
            public int size;
            public RDEOPT options;
            public IntPtr handle;
            public IntPtr reserved;
            public IntPtr reserved1;
            public RASEAPINFO eapInfo;
#if (WIN7 || WIN8)
            public bool skipPppAuth;
            public RASDEVSPECIFICINFO devSpecificInfo;
#endif
        }

WIN7、WIN8是在VS里自定义的原则编译符号,略过不谈。StructLayout特性指示结构字段在内存中如何分布,当导出到非托管代码时非托管对象亦按此布局。StructLayout有几个特性:

  1. LayoutKind,有多少个枚举值:Sequential,对象的积极分子遵照它们出现的一一依次布局,并且同StructLayout的另一个性能Pack有关,详细规则可以参见内存对齐的规则以及效用,这篇作品中的#pragma
    pack()同那里的Pack功用一样;Explicit,对象的一一成员的精确地点被显式控制,每个成员必须选用System.Runtime.InteropService(Service)s.FieldOffsetAttribute提示该字段在档次中的地方,当映射到C/C++的union时,该枚举值万分管用;Auto,运行时自动目的的积极分子选取适用的布局,可能会对字段顺序举办调整,使实例占用尽可能少的内存(当然前提是逐一字段独享自己的内存,不同于union)。考虑到CPU读取功效,一般采纳LayoutKind.Sequential。
  2. Pack,第1条已述。
  3. CharSet,提醒字符是单字节or双字节,这首要是野史遗留问题。可以将之设为Auto,这样,在 Windows NT、Windows 2000、Windows XP 和
    Windows Server2003
    体系上,默认值为 System.Runtime.Interop瑟维斯(Service)s.CharSet.Unicode;在
    Windows 98 和 Windows Me
    上,默认值为 System.Runtime.Interop瑟维斯(Service)s.CharSet.Ansi。
  4. Size,提醒类或结构的相对化大小。不常用,可是假设急需在结构末尾分配额外的上空,则可能会用到此属性。 

结构体的ULONG_PTR等代表基元类型指针的字段,只好选拔IntPtr映射;若字段有预定义的若干值表示有意义的情状提示等,则足以应用enum映射,如dwfOptions标记RasDial的一点扩充音信,这一个标记可以用枚举值表示。

        [Flags]
        public enum RDEOPT
        {
            None = 0x0,
            UsePrefixSuffix = 0x1,
            PausedStates = 0x2,
            IgnoreModemSpeaker = 0x4,
            //...
        }

RasDial还有个参数值得注意——lpvNotifier——即使LPVOID类型表示这是个不透明指针,用IntPtr即可,但文档所述表明这是个回调函数参数,当
Win32
函数需要再次回到多项数据时,平常都是因此回调机制来促成的,开发人士将函数指针传递给函数。.Net中有个门类专门用作艺术的引用——Delegate,所以用Delegate映射更可靠更利于。

最终RasDial函数的C#卷入版本如下:

        [DllImport(NativeMethods.RasApi32Dll, CharSet = CharSet.Unicode)]
        private static extern int RasDial(
            IntPtr lpRasDialExtensions,
            string lpszPhonebook,
            IntPtr lpRasDialParams,
            RasNotifierType dwNotifierType,
            Delegate lpvNotifier,
            out RasHandle lphRasConn);

可以看来lpRasDialExtensions使用的品类是IntPtr,如前所述,我们要手动为其分配内存(非托管),并写入相应数额,关键代码如下:

 1             try
 2             {
 3                 IntPtr lpRasDialExtensions = IntPtr.Zero;
 4                 var extensions = new RASDIALEXTENSIONS();
 5                 //根据StructLayout相关属性计算内存大小
 6                 int extensionsSize = Marshal.SizeOf(typeof(RASDIALEXTENSIONS));
 7                 extensions.size = extensionsSize;
 8 #if (WIN7 || WIN8)
 9                 extensions.devSpecificInfo.size = Marshal.SizeOf(typeof(RASDEVSPECIFICINFO));
10 #endif
11                 lpRasDialExtensions = Marshal.AllocHGlobal(extensionsSize);
12                 Marshal.StructureToPtr(extensions, lpRasDialExtensions, true);
13             }
14             catch (Exception)
15             {
16                 //...
17             }
18             finally
19             {
20                 if (lpRasDialExtensions != IntPtr.Zero)
21                 {
22                     Marshal.FreeHGlobal(lpRasDialExtensions);
23                 }
24             }

代码并不复杂,其中Marshal.StructureToPtr(object structure, IntPtr ptr,
bool fDeleteOld)方法的第五个参数表明如下:

倘诺 ptr 指向非托管内存块。此内存块的布局由相应的托管类 structure
描述。StructureToPtr将字段值从社团封送到指针。假诺 ptr
块包含引用字段,该字段指向当前带有“abc”的字符串缓冲区。倘使托管端上相应的字段是包含“vwxyz”的字符串。倘若不另行通告它,StructureToPtr将分配一个新的非托管缓冲区来保存“vwxyz”,并将它互换到ptr
块。这将舍弃旧缓冲区“abc”使之漂移而不将其获释回非托管堆。最终,您将赢得一个孤立的缓冲区,它代表在代码中留存内存泄漏。假使将
fDeleteOld 参数设置为真,则StructureToPtr
在延续为“vwxyz”分配新缓冲区以前释放保存“abc”的缓冲区。

调用为止后记住要动用马尔斯(Mars)hal.FreeHGlobal释放非托管内存。

DotRas


以上代码来自于一个开源项目DotRas,尽管本人并不提倡重复造轮子,但大体知道车轮怎么造总没有害处。由于作者家里条件不容许——光纤入户——so,我借用朋友的虚拟机(ADSL)举行DotRas的调用测试,重要代码如下:

 1 //断开
 2 private void btnHangUp_Click(object sender, RoutedEventArgs e)
 3 {
 4     if (_dataContext.SelectedRasConnection != null)
 5     {
 6         var conns = RasConnection.GetActiveConnections();//获取当前所有活动连接
 7         var conn = conns.First(o => o.EntryId == _dataContext.SelectedRasConnection.EntryId);
 8         if (conn != null)
 9         {
10             RasIPInfo ipAddresses = (RasIPInfo)conn.GetProjectionInfo(RasProjectionType.IP);
11             tbTestInfo.Text += "_前_" + ipAddresses.IPAddress.ToString();
12             conn.HangUp();//断开,断开后RasConnection.GetActiveConnections()返回值里就没它了
13             System.Threading.Thread.Sleep(10000);
14             DialUp(_dataContext.SelectedRasConnection.EntryName);
15         }
16     }
17 }
18 
19 //拨号连接
20 private void DialUp(string entryname)
21 {
22     RasDialer dialer = new RasDialer();
23     dialer.EntryName = entryname;
24     dialer.PhoneNumber = " ";
25     dialer.AllowUseStoredCredentials = true;
26     dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);
27     dialer.Timeout = 1000;
28     dialer.Dial();
29 
30     if (_dataContext.SelectedRasConnection != null)
31     {
32         var conns = RasConnection.GetActiveConnections();
33         var conn = conns.First(o => o.EntryId == _dataContext.SelectedRasConnection.EntryId);
34         if (conn != null)
35         {
36             RasIPInfo ipAddresses = (RasIPInfo)conn.GetProjectionInfo(RasProjectionType.IP);
37             tbTestInfo.Text += "_后_" + ipAddresses.IPAddress.ToString();
38         }
39     }
40 }

亚洲城误乐城ca88网站,界面如图:

亚洲城误乐城ca88网站 1

点断开后,果然远程桌面断开了:

亚洲城误乐城ca88网站 2

10分钟后,虚拟机重拨连接,再伺机一段时间后(那个日子相比长有1到3分钟,远远没达标实用的正规化,可能是花生壳域名重新分析的案由;经朋友在地头测试,速度杠杠的),界面重新突显:

亚洲城误乐城ca88网站 3

可以看出前后的IP是不雷同的。

 

此外参考资料:

据悉VC++的RAS拨号连接技术及其使用((哈博罗内科技大学)何璐、陈和平、肖刚)

VPN——虚构专用网络

C#中使用Win32类库

Calling Win32 DLLs in C# with
P/Invoke
.aspx)

C#
托管内存与非托管内存之间的更换(结合Unity3d的实在开支)

 

转载请注脚本文出处:http://www.cnblogs.com/newton/p/4299352.html