一、问题现象
-
终端输入无响应
- 启动
iperf
服务器后,终端被阻塞,无法输入其他命令(如图中重复输出日志覆盖输入区域)。 - 直接原因:
iperf_server
线程未正确处理退出标志,导致select
或accept
长期阻塞。
- 启动
-
重复绑定端口日志
- 终端频繁输出
本地端口号是5001
,表明:- 服务器套接字未正确关闭,重复初始化。
- 端口被其他进程占用(可能因异常退出导致)。
- 终端频繁输出
-
无法通过
iperf --stop
终止服务- 全局标志
param.mode
未触发线程退出循环。
- 全局标志
二、根本原因
-
代码逻辑缺陷
iperf_server
中select
调用阻塞时间过长(默认3秒),未及时检测退出标志。- 未强制关闭套接字,导致线程卡在
accept
或select
。
-
资源未释放
- 异常退出时,套接字未关闭,端口未释放,重启时触发
bind
错误。
- 异常退出时,套接字未关闭,端口未释放,重启时触发
-
终端配置问题
- MobaXterm未启用本地回显(Local Echo),输入内容被日志覆盖。
三、解决方案
1. 代码修复(关键修改)
// 修改iperf_server循环逻辑
void iperf_server(void *thread_param) {struct timeval timeout;timeout.tv_sec = 1; // 缩短超时时间至1秒while (param.mode != IPERF_MODE_STOP) {// 每次循环重置超时timeout.tv_sec = 1;FD_SET(sock, &readset);ret = select(sock + 1, &readset, NULL, NULL, &timeout);if (ret == -1 || param.mode == IPERF_MODE_STOP) break; // 及时退出// 处理连接...}// 强制关闭套接字(避免阻塞)if (sock >= 0) {shutdown(sock, SHUT_RDWR);closesocket(sock);}
}
2. 命令行操作
操作 | 命令 | 说明 |
---|---|---|
启动服务器 | iperf -s -p 5001 & | & 后台运行,避免阻塞终端 |
停止服务器 | iperf --stop 或 killall iperf | 全局标志触发退出或强制终止进程 |
验证端口监听 | `netstat -an | grep 5001` |
3. MobaXterm配置
-
启用本地回显
- 右键终端 → Settings → Terminal → 勾选:
- ✅ Local echo
- ✅ Local line editing
- 右键终端 → Settings → Terminal → 勾选:
-
串口参数
- 波特率:115200
- 数据位:8,停止位:1,无流控
- 设备路径:
COM7 (USB-SERIAL CH340)
(需根据系统识别调整)
四、操作流程
-
启动服务器
iperf -s -p 5001 & # 后台启动
- 预期输出:
[1] 12345
(进程ID)和单次本地端口号是5001
。
- 预期输出:
-
客户端测试
在其他设备执行:iperf -c 192.168.16.112 -p 5001 # 替换为MCU的IP
- 成功标志:服务端打印客户端连接信息及带宽。
-
终止服务器
iperf --stop # 或 kill -9 [进程ID]
- 验证:
ps | grep iperf
无结果,netstat
显示端口释放。
- 验证:
五、注意事项
-
硬件连接
- 确保USB转串口线(CH340)稳定连接,避免频繁插拔导致COM口失效。
-
线程优先级
- 调整RTOS线程优先级,避免iperf占用过高优先级阻塞终端任务:
sys_thread_new("iperf", iperf_server, NULL, 2048, 3); // 优先级设为3(低于默认)
- 调整RTOS线程优先级,避免iperf占用过高优先级阻塞终端任务:
-
内存泄漏
- 使用
pvPortMalloc
和vPortFree
确保内存释放,添加分配失败检查:if (!send_buf) {printf("内存不足!\n");return; }
- 使用
六、故障排查表
现象 | 检查点 | 解决措施 |
---|---|---|
终端输入无响应 | 是否后台运行?jobs 命令查看 | 使用fg 切前台后Ctrl+C 终止 |
端口绑定失败 | 端口是否被占用?netstat 检查 | 更换端口或重启设备 |
客户端无法连接 | 防火墙/路由设置,IP是否正确 | 关闭防火墙,检查子网掩码 |
通过以上整理,可系统化解决iperf在MobaXterm串口终端中的使用问题,确保服务器可控运行及终端输入正常。