- 平台差异
拟使用windows7平台,linux平台依赖的系统文件及对应链接库,须在windows平台找到对应库,或者替代库。
(1)如sys/types.h ,sys/ioctl.h ,net/if.h 等,因为平台差异所以在代码中会尽量避免使用,或寻找替代。
(2)util文件夹下的thread_safe_queue.h,timer.h,unique_queue.h无用,可删。
(3)包含路径不同,如linux下的home路径,在windows中会很少使用,应尽量使用相对路径。
- QT版本差异
拟使用Qt5.11.1,QtCreator4.6.1,VS2017_64bit(MSVC14.1)。
- QT5模块划分和QT4有所不同,需要调整头文件包含,比如QWidget模块已经从QtGUI模块剥离。
需要修改一下 *.pro 为如下:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- 有些模块已经不存在:
QWSServer:Qt4的程序在嵌入式Linux运行时,需要加入参数“-qws”启动Qt窗口系统服务,如“./app -qws”运行app程序。从Qt5.0开始,Qt自身不再单独实现窗口系统,QWS不复存在,取而代之的新机制是QPA(Qt平台抽象),QPA使得Qt对不同平台的支持变得更加灵活,当需要支持一个新平台时,只需为该平台编写一个QPA插件。
目前关注这些,实际情况可能会遇到更多问题。
- 三方库
- Boost 1_50_0
- Glog 0.3.5
- Qscintilla_gpl_2_10_8
- Sqlitecipher(OpenSSL 1.0.2 windows)_windows_master
版本信息根据实际情况调整。
四、重点功能
4.1网络通讯
目前QNetWorkProxy模块是基于st_asio_wrapper开发的,而st_asio_wrapper是一个c/s网络编程框架,基于对boost.asio的包装,目的是快速的构建一个c/s系统;从boost.asio继承而来,只支持tcp和udp协议。移植难点如下:
(1)Boost本身是跨平台,所以可以移植到windows,需重新编译相关库并测试;
(2)模块中依赖的sys/types.h ,net/if.h ,sys/ioctl.h 等linux系统文件需要考察替代文件和相应库,否则只能自己实现,或者通过qt实现:
①ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而 ifconf结构通常是用来保存所有接口的信息的。
替代:ifreq可以用NCB代替,需包含windows.h,并在使用处更改结构内容。
②int ioctl(int fd, unsigned long cmd, void *data)方法在sys/ioctl.h中。第一个参数是文件描述符,第二个参数代表传递的命令,它会原样传递给驱动,第三个参数是可选类型的,主要根据第二个参数选择,第三个参数无论是整数还是指针,都会以unsigned long的形式传递给驱动程序。
替代:暂未找到。
综上,通过替换系统依赖的方法解决并不简单,且改动量较大,而QT自带QNetWorkProxy类能够更方便的实现网络通讯,且完全支持跨平台,便于以后的跨平台代码管理,研究后决定使用QT自带QNetWorkProxy类重新实现网络通讯模块。
4.2 NFS挂载
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
- windows使用NFS功能需要手动安装NFS服务,安装过程可参考https://jingyan.baidu.com/article/0a52e3f4dc3f4abf63ed7259.html,但是windows10家庭版无法安装,所以尽量使用windows7。
- 目前使用的FILE *vpopen(const char* cmdstring, const char *type, int timeout_ms)函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行挂载命令。需要找到在windows中的替代。
替代:windows中的_DCRTIMP FILE* __cdecl _popen( _In_z_ char const* _Command,_In_z_ char const* _Mode )函数可实现相同功能。需要包含stdio.h,stdlib.h两个头文件。