在过去的两天里,我一直无法找到解决方案的答案:
可以使用C#Mono或受支持的第三方框架在3个主要平台(OSX,Windows,Linux)上的虚拟接口上创建和管理第2层隧道吗?
在高层次上,像Hamachi或Tunngle这样的应用程序将是我想要在基本层次上实现的目标的真实示例。
这个问题的目的在于,是否有可能编写有效的跨平台代码,或者我是否必须诉诸于平台特定的代码来实现虚拟接口。
那要看。由于L2TP实际上是使用UDP数据报完成的,因此没有理由不能在C#中实现它。但是,将它与操作系统(作为虚拟接口驱动程序等)集成起来几乎是不可能的-我希望唯一的真实方法是拥有一个小的本机包装程序,该包装程序调用完成大部分工作的托管代码。
换句话说,您可以在.NET中很好地编写Hamachi。编写Hamachi网络适配器是棘手的部分。另外,如果您只是想向应用程序添加L2TP功能,那也没有问题(代替TcpClient / UdpClient等,您只需使用自己的与L2TP类进行通信的类即可)。但是,将其集成到IP基础结构确实需要您编写驱动程序,该驱动程序通常是纯本机区域。
可能是有些具有虚拟网络适配器且可以调用DLL的现成解决方案,但是我不知道有什么解决方案。一种非常不安全的方法也将是在Socket调用上创建钩子,但是我将不赘述,因为这非常棘手,而且总体上是个坏主意:D
换句话说,您可以选择使用混合方法-为要支持的所有平台使用最少的本机驱动程序,然后让他们调用托管库来完成所有实际工作-托管库可以独立于平台(只要那里支持Mono即可:)。
现在,每个操作系统可能都有自己的VPN客户端,您可以从.NET方便地使用它。但是,这还意味着您的应用程序将必须能够分别支持这些OS以及它们各自的VPN客户端-这将非常棘手。
如果您想编写自己的网络接口驱动程序,在Windows上启动的一个好方法是驱动程序开发套件,其中包含一些NIC驱动程序的示例源代码。Windows使用NDI(http://en.wikipedia.org/wiki/Network_Driver_Interface_Specification),即使在* nix系列的OS上也有一些支持,因此可能相对容易地做到这一点-但不要忘记,您重新编写驱动程序。除非您对C / C ++ / ASM和OS内核以及驱动程序模型有丰富的经验,否则您可能不在这里。这就是导致蓝屏死机的原因:)
还有一些相关技术,例如TDI(传输驱动程序接口)或WFP(Windows筛选平台),可以在用户空间而不是内核/驱动程序空间中完成所有这些操作。但是,这些是Windows技术。您必须在要支持的其他OS上找到等效的产品,并且必须做一些魔术才能使其在一个跨平台应用程序中都能正常工作。在执行所有这些操作的同时,您要保持性能-这需要在.NET中进行非常仔细的编程(在.NET中编写可靠的代码很容易,但是要获得最先进的性能则更加困难。C/ C ++ / ASM恰恰相反-快速执行操作相对容易,但是可靠性会受到影响。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句