当前位置: 首页 > news >正文

一种命令行版的网络调试助手

背景

网络调试助手是一个用来收发网络协议包的工具,它长这样子网络调试助手截图
该工具只能运行在Windows图形界面下,虽然也有linux版,但也是运行在图形界面的,对于这群用户来说,仍然不方便:

  1. 调试机没有图形界面
  2. 调试机有图形界面,但与目标板没有网络连接,或只有串口连接

针对上面两种情况,我打算开发一个命令行版的网络调试助手。

失败的尝试

一开始打算用netcat加命名管道printf命令实现,但是因为自己对命名管道不太熟悉,摸索一番没有搞定,后来看到国外这篇论坛帖子感觉靠谱,但目测使用体验跟GUI版的网络调试助手有差距,于是决定写代码实现。

实现思路

网络连接

使用geeksforgeeks这篇文章的client.c做网络连接模板,但ip和端口号弄成可配的:

    servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = inet_addr(argv[1]);servaddr.sin_port = htons(atoi(argv[2]));

协议数据转换

通过C语言的格式化输入函数sscanf实现字符版HEX数据二进制数据的转换

            for (i = 0; i < count; i ++) {if (buff[i] == ' ') {i++;} else {sscanf(&buff[i], "%02hhx", &bin[j]);i += 2;j++;}}

注意,这个%hhx就表示1字节的字符版HEX数据,前面加个02凑成%02hhx就能解析000A这种加前导零的数据了。

读取服务器响应

GUI版网络调试助手会实时返回服务端的响应,但是我的命令行版不想开后台线程接收(麻烦),于是取了个巧,让用户告诉助手什么时候去读响应,这时候一定能读到响应,不会让助手卡死在read系统调用里😉

因为这个消息是用户发给助手的,算user cmd,不是发给服务端的(算user req),因此要做区别处理,区别办法就是user cmd是以冒号开头的,参考vim

        if (buff[0] == ':') {// user cmdif (strncmp(&buff[1], "read", 4) == 0) {sscanf(&buff[1+4+1], "%u", &resp_len);printf("Reading Response for %u bytes...\n", resp_len);bzero(buff, sizeof(buff));count = read(sockfd, buff, resp_len);for (i = 0; i < count; i ++) {printf("%02hhx ", buff[i]);}printf("\n");} else if ((strncmp(&buff[1], "exit", 4)) == 0) {printf("Client Exit...\n");break;}} else {// parse user req data (执行上一段的代码)// send user req datawrite(sockfd, bin, j);j = 0; // clear user req data}

目前只实现了2个user cmd:

  1. read #bytes,读取指定字节数的服务端响应
  2. exit,退出助手界面

最终效果

console_net_assist
开2个tmux窗口,上面的串口启动netcat来假装服务端,下面的串口启动console_net_assist来当客户端,上图的交互时序为:

  1. 运行netcat -l 1234启动服务端
  2. 运行./console_net_assist 127.0.0.1 1234启动助手(即客户端)
  3. 用户在助手的> 提示符侧输入二进制协议数据aa 55 55 aa 00 00 00 01,然后按回车
  4. 助手会将这串HEX字符串转换成二进制数据发给服务端
  5. 服务端处理客户端的请求数据——输出到stdout(netcat默认行为)
  6. 用户在助手的> 提示符侧输入命令:read 4以读取约定的4字节应答
  7. 用户(假扮服务器)在服务端的stdin输入good表示4字节的响应
  8. 助手立即读取4字节响应并以HEX字符串的形式打印
  9. 用户在在助手的> 提示符侧输入命令:exit,退出

总结

这是个quick and dirty的小工具,谈不上代码质量,只为了解决问题,因此只有100行左右,需要的可以去我的gitee仓库下载

http://www.dtcms.com/a/334832.html

相关文章:

  • 一周学会Matplotlib3 Python 数据可视化-绘制绘制甘特图
  • EXTI外部中断的执行逻辑|以对射式红外传感器计次为例
  • 广东省省考备考(第七十八天8.16)——资料分析、判断推理(强化训练)
  • 力扣(最小覆盖子串)
  • Hana IDE 安装吧报错
  • 【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
  • Reading Coach-微软推出的免费AI阅读教练
  • linux I2C核心、总线与设备驱动
  • 扫地机器人(2025蓝桥杯省A组 H题)
  • [系统架构设计师]系统架构设计基础知识(七)
  • Conda创建py3.10环境(股票),并且安装程序包的命令
  • 《设计模式》装饰模式
  • python日志新姿势,Loguru库的应用
  • 后台管理系统-3-vue3之左侧菜单栏和头部导航栏的静态搭建
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-用户管理
  • 力扣(LeetCode) ——142. 环形链表 II(C语言)
  • [Python]PTA:实验2-3-1-for 求1到100的和
  • ComfyUI-3D-Pack:3D创作的AI神器
  • 深度强化学习是否违背样本独立原则?
  • 使用IntersectionObserver实现页面右侧运营位区域固定,和页面列表数据分页加载
  • CSS复习
  • Euler 采样器在扩散模型中的原理解析:从数学公式到实践应用
  • Apereo CAS靶场渗透练习
  • 【Linux系统】进程间通信:System V IPC——共享内存
  • Flink 源码系列 - 前言
  • 如何使用5个时间步长创建移动平均特征
  • 自动驾驶中的传感器技术33——Lidar(8)
  • Leetcode 14 java
  • 数论之普通判别法、埃氏筛与线性筛的应用及其对比
  • PowerShell 第11章:过滤和比较(下)