基于学校官方提供的Linux认证客户端编写,适用于支持POSIX标准的环境(Linux,BSD,Cygwin...)
主要是为了缓解以下问题
- 学校官方仅提供图形界面客户端
- GitHub的C/C++轮子过旧,校园网UDP丢包断线
- 运行在Java和Python解释器上的客户端过于臃肿
吉林大学校园网采用DRCOM D版认证协议(UDP),主要包括关于DRCOM协议的具体内容请参考GitHub DRCOM仓库
flowchart LR
challenge_login[Login Challenge]--> login[Login]
login --> keep_alive_auth[Keep Alive Auth]
keep_alive_auth --> keep_alive_auth
login --> keep_alive_heart_beat[Keep Alive Heartbeat]
keep_alive_heart_beat --> keep_alive_heart_beat
keep_alive_auth --> ctrl_c[Ctrl+C Signal Received]
keep_alive_heart_beat --> ctrl_c
ctrl_c --> challenge_logout[Logout Challenge]
challenge_logout --> logout
- 发送登录challenge,获取salt用于登录
- 使用salt构建登录数据包进行账号登录
- 发送两种心跳包保持在线,同时程序监听linux命令行的Ctrl+C信号(SIGINT)
- 收到SIGINT信号,执行下线流程,发送下线challenge后获取salt进行下线
- 主进程完成上述1,2步骤后启动两个独立的线程(pthread)发送不同的心跳包
- 实测UDP协议在校园网环境下会有丢包,导致认证服务器收不到心跳包使客户端下线,为了缓解UDP的丢包问题,客户端使用日志记录器Logger记录上一轮发送的心跳包、发送时间、发送数以及回复数,使用Resender监视日志,如果心跳包在发送后2秒后未收到服务器应答则进行重发,重试3次无应答后退出客户端,Render为2个独立线程分别负责两种心跳包的重发
sequenceDiagram
participant Threads_Heartbeat
participant Logger
participant Threads_Resender
Threads_Heartbeat ->> Logger: Write heartbeat logs
Logger ->> Threads_Resender: Read heartbeat logs
git clone https://github.com/AndrewLawrence80/jlu-drcom-client.git
修改 config.h
#define CONFIG_USERNAME "xiaoming22" // 邮箱账户,无@后缀
#define CONFIG_PASSWORD "xiaoming123456" // 邮箱密码
#define CONFIG_IP "192.168.1.100" // 校园网IP
#define CONFIG_MAC "\x00\x00\x00\x00\x00\x00" // 校园网IP关联的MAC地址
#define CONFIG_HOST_NAME "xiaoming-linux" // 主机名,linux可以在命令行运行hostname
#define CONFIG_OS_INFO "5.10.0-amd64" // 操作系统版本,linux可以在命令行运行uname -r
Debian/Ubuntu
sudo apt install build-essential binutils linux-headers-amd64 make gcc
为代码所在的机器/相同指令集的机器编译
make
为不同指令集的机器编译,以openwrt为例
在Openwrt下载页面下载对应指令集的SDK,例如MT7621SDK,解压
export PATH := $(PATH):[解压路径]/openwrt-sdk-[版本]-[指令集]_gcc-[gcc版本]_[libc版本].Linux-x86_64/staging_dir/toolchain-[指令集]_gcc-[gcc版本]_[libc版本]/bin/
export STAGING_DIR := [解压路径]/openwrt-sdk-[版本]-[指令集]_gcc-[gcc版本]_[libc版本].Linux-x86_64/staging_dir/toolchain-[指令集]_gcc-[gcc版本]_[libc版本]/
CC=[上述toolchain/bin目录下的gcc]
LD=[上述toolchain/bin目录下的ld]
# CC=gcc
更多关于Openwrt下的编译参考Openwrt官方文档
Linux下使用Screen
GitHub DRCOMS GitHub ly0 GitHub mchome Github Yesterday17 Github youthlin
- 详细描述你的问题
- 复现方法
- 程序日志