Jump The Great Firewall【step13 支持Windows】

一、解决驱动问题

由于Windows下并没有tun/tap驱动,应此对Windows版本的移植变得十分困难,不过幸运的是OpenVPN有一个开源项目《tap-windows》。借助于它的源代码,博主编写了qtun自己的驱动,姑且命名为《qtun_sys》。其主要在NDIS框架之上构建了一张虚拟网卡,借助这张虚拟网卡我们可以像Linux下的tun驱动那样来使用它。不过,令人不爽的是Windows下的驱动并不符合POSIX标准,我们不能像Linux底下那样使用open来打开它,同样也不能使用select来查看它有没有数据被送出。我们只能用Windows的标准函数CreateFile、WriteFile、ReadFile和DeviceIoControl等函数来与该驱动通信。由于不能使用select函数来得知该驱动是否有数据被发出,应此我在该驱动中定义了接口IOCTL_HAVE_DATA,它返回一个字节的数据,表示是否有数据抵达这张网卡。

二、解决跨平台问题

在新的代码中,你将看到许许多多的#ifdef WIN32之类的代码,以此来隔离Windows与Linux之间的代码不兼容问题,这里不一一展开进行描述。

三、各种坑

  1. 在Windows中位域总是按照某种类型对齐的,既:

    typedef struct
    {
        unsigned char  a : 4;
        unsigned short b : 4;
    } A;
    

    以上结构在Windows下的大小为3个字节,在Windows下编译器总是先将某一种结构填满,然后继续填充下一种结构。由于属性a为unsigned char结构,编译器在看到b类型为unsigned short时,发现其与a的类型不同。应此它将a后面的4个比特位填充,使其占满一个unsigned char长度,同样的b结构后的12个比特位同样被填充了。应此类型A的大小为3个字节,这一点是与gcc与clang不同的地方。

  2. 由于Windows驱动不符合POSIX标准,应此无法使用select函数,按照上文的说法我们采用自定义接口IOCTL_HAVE_DATA来得知是否有数据抵达该虚拟网卡,又由于qtun是单线程的。所以我们不能将select阻塞太长时间,应此我们将服务端和客户端的select时间调整为1微秒。
  3. 由于底层驱动没有处理ARP包,应此ARP表需要上层程序进行维护,所以在链接建立后需要使用命令"arp -s xxx ff-ff-ff-ff-ff-ff"来将对端的IP地址加入到ARP表中,其中xxx表示对端的内部IP地址。由于我们使用的是tun设备,应此MAC地址可以随意指定,这里将其MAC地址设置为广播地址。

四、完整代码

完整代码可到step13中找到

五、注意

通过反复安装驱动,可得到多张网卡,应此qtun在启动时若检测到当前机器含有多张qtun虚拟网卡,则会询问用户选择哪张网卡。

六、请关注

请关注http://blog.q-devel.com,您将第一时间的得到当前qtun的开发进展。

时间: 2024-12-11 01:45:25

Jump The Great Firewall【step13 支持Windows】的相关文章

我持续推动Rust语言支持Windows XP系统

前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸): 甲方:Rust应该支持XP呀 乙方:微软官方已经放弃维护XP.我们为什么要支持一个不安全的系统? 甲方:从技术上说Rust支持XP应该也不难 乙方:不是必需为一个老旧的系统付出开发和维护成本 甲方:XP在全世界还有非常多装机量.甚至远超Mac OS系统 乙方:XP是不安全的系统 甲方:我们的客

[转]CSDN博客频道支持Windows Live Writer离线写博客啦

今天下载了最新的windows live writer 但是不能配置csdn模块发布了,找到了这个信息后才知道完成了如下修改配置. 各位尊敬的CSDN用户: 你们好!  为了更好的服务于用户,CSDN博客频道已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW ,现在您可以随时随地撰写博客,不用登录即可编辑和发表博客啦.WLW 可以直接打开任何之前已经发布的日志,修改并重新发布,确保您在

Firefox 将停止支持 Windows XP 和 Vista

https://support.mozilla.org/zh-CN/kb/firefox-windows-xp-vista Firefox 52 版是最后一个针对 Windows XP 和 Windows Vista 的完整升级.还会有安全更新发布,但不再有新功能. 为什么 Firefox 停止支持 Windows XP 和 Vista? Firefox 是仅存的还支持 Windows XP 和 Vista 的浏览器.Microsoft 自己都已经从 2014 年不再支持 Windows XP

python commands包不支持windows环境与如何在windows下使用的简易方法

commands模块不支持windows环境,让我们来看看. >>> import commands >>> print commands.getoutput('dir') '{' 不是内部或外部命令,也不是可运行的程序 或批处理文件. >>> 查看commands.getoutput的源代码: def getoutput(cmd): """Return output (stdout or stderr) of execu

公告:CSDN博客频道支持Windows Live Writer离线写博客啦

各位尊敬的CSDN用户: 你们好! 为了更好的服务于用户,CSDN博客频道已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW ,现在您可以随时随地撰写博客,不用登录即可编辑和发表博客啦.WLW 可以直接打开任何之前已经发布的日志,修改并重新发布,确保您在脱机时所作的修改与您发布的内容同步. 以下是安装WLW 和相关设置: 1. 下载安装WLW (步骤略,可自行下载),添加日志账户,如图

让Qt Creator支持Windows Phone 8开发

近期QtCreator3.2出了.修复了一些Bug.比上一个版本号3.1.2要好了一些. 因为在上一个版本号(Qt for WinRT自带的)对于打包方面有一些问题效果不好,于是今天我下载这个IDE过来试一试.一開始想设定Windows Phone 8的开发环境的,可是总是没有设置成功. 最后我找到了一个办法,使用这个办法顺利地设置好了支持Windows Phone 8开发环境的Qt Creator. 打开Qt Creator,一開始是除了桌面设备没有发现不论什么其他设备的. 可是我看了下,Qt

iConvert Icons 图标转换生成利器,支持Windows, Mac OS X, Linux, iOS,和Android等系统

这是一款在线图标转换工具,生成的图标支持Windows, Mac OS X, Linux, iOS, 和 Android等主流系统. 可以上传图标文件转化成另一个平台下的图标文件,例如将windows系统下的icon图标格式转换成mac os下的icns图标格式,也可以通过上传图片从而生成你指定平台下的图标格式文件.例如上传png文件转换成windows系统下的icon图标文件. 官网在线应用地址:iConvert Icons 其也有app可供下载,但要付费. 原创文章,转载请注明: 转载自 h

FinalShell服务器管理软件,SSH客户端下载,支持Windows,Mac OS X,Linux

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 用户QQ群 342045988 Windows版下载地址:http://www.hostbuf.com/downloads/finalshell_install.exe Mac版,Linux版安装及教程:http://www.hostbuf.com/t/1059.html FinalShell 服务器加速教程 更新日志:http://www.hostbuf.com/t

告示:CSDN博客通道支持Windows Live Writer写blog离线好友

尊敬的各位CSDN用户: 您好! 为了更好的服务客户.CSDN已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW .如今您能够随时随地撰写博客.不用登录就可以编辑和发表博客啦.WLW 能够直接打开不论什么之前已经公布的日志.改动并又一次公布.确保您在脱机时所作的改动与您公布的内容同步. 下面是安装WLW 和相关设置: 1. 下载安装WLW (步骤略,可自行下载.官方下载地址:id=86