Skip to content

AndrewLawrence80/jlu-drcom-client

Repository files navigation

吉林大学校园网认证客户端(C语言版)

基于学校官方提供的Linux认证客户端编写,适用于支持POSIX标准的环境(Linux,BSD,Cygwin...)

客户端编写初衷

主要是为了缓解以下问题

  1. 学校官方仅提供图形界面客户端
  2. GitHub的C/C++轮子过旧,校园网UDP丢包断线
  3. 运行在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
Loading
  1. 发送登录challenge,获取salt用于登录
  2. 使用salt构建登录数据包进行账号登录
  3. 发送两种心跳包保持在线,同时程序监听linux命令行的Ctrl+C信号(SIGINT)
  4. 收到SIGINT信号,执行下线流程,发送下线challenge后获取salt进行下线

客户端实现

  1. 主进程完成上述1,2步骤后启动两个独立的线程(pthread)发送不同的心跳包
  2. 实测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

Loading

如何使用

下载代码库

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为例

下载交叉编译SDK

Openwrt下载页面下载对应指令集的SDK,例如MT7621SDK,解压

修改Makefile

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

关于Issue

提问的智慧

  1. 详细描述你的问题
  2. 复现方法
  3. 程序日志

About

吉林大学校园网认证客户端(C语言版)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published