大概是23年的这个时候,我自己撸了一个程序,给v加了给守护进程。虽然代码不伦不类,UI可以说是没有,但是好在运行一直还算稳定,唯一的诟病之处就是断开连接的时间比较长,还有跑在我的OpenWRT上会因为PPPOE重拨自动退出。
这一次迭代,就是为了解决这两个问题,当我打开了上一次打包的源码,仅仅看了一眼我就放弃了。没有备注、没有文档。实在是不想尝试解读这一串臃肿而又驴头不对马嘴的代码了。于是我选择了重构。粗略的回顾了一下,与其称之为程序,还不如称为Hello Word。
之前的版本
新版本
现代的软件工程学中,前人们已经总结出了多种开发模型,参考前人们的智慧,我在编码之前对需求进行了分析,并且画出了基本的业务流程图,继承了之前版本的一些设计思路,重新对代码进行了抽象和封装。
新的程序替换上后,切换的效率是立竿见影,如果对你有帮助或者想要源码,可以与我联系,欢迎对我的项目提出意见或者指正错误的地方。这里记录一下开发过程中遇到的一些问题和解决办法:
编译器的选择
在编码的时候,出于习惯和便利性的考虑,我一直都是在Windows上使用Visual Studio的跨平台功能在Linux环境下进行开发。由于这次将C/S分开实现,导致了一个问题,我在DEBUG的时候,没有办法在同一个Linux上监听同一个端口。所以,我需要在Linux上也部署一个开发环境。于是我选择了的Debian桌面加Visual Studio Code进行开发,体验也非常的不错。
与VS不同的是,VS Cdoe需要更多的手动配置,包括编译的顺序和编译的方法,这些都需要在tasks.json中定义好,这个是我Server项目中的配置文件。还有如果使用GDB调试还需要另外配置一个launch.json文件。
{
"tasks": [
{
"label": "C/C++: g++ build all cpp files",
"type": "shell",
"command": "/bin/bash", //前置执行命令
"args": [
"-c",
"g++ -g -c ${fileDirname}/*.cpp"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$gcc"
},
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${fileDirname}/basic.o",
"${fileDirname}/model_s.o",
"${fileDirname}/v2dd_s.o",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lssl",
"-lcrypto",
"-lncursesw"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"dependsOn":[
"C/C++: g++ build all cpp files"
],
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
NCURSES库
在上一个版本中,UI的实现参考了CRT显示器,一行一行的打印文字在屏幕上,简单实用,但缺点也很明显,输出的内容杂乱无章,缺乏逻辑控制。秉着不重复造轮子的观念,我询问了GPT,它告诉我了一个叫做NCURSES的 古老TUI框架库,有多古老呢?早在2001年就已经有前辈对官方帮助文档进行翻译。这是一份来自近25年前的NCURSES库中文帮助文档:NCURSES Programming HOWTO 中文版(简体中文)
这里记录一下NCURSES的使用技巧,与cout不一样的是,wprint函数并不会直接将数据输出到屏幕上,而是输出到缓冲区域,需要调用refresh()或者doupdate()函数才会将缓存区的数据打印到屏幕上,而且 NCURSES也可以同时创建多个缓冲区,可以实现一些比如多窗口切换的效果。在我的程序中,我只用到了Window库,并没有用到面板库。这里是ncurses-6.4版本的官方帮助文档:Welcome to ncurses,其中包括了英文版的NCURSES Programming HOWTO