??一、問題現象??
-
??終端輸入無響應??
- 啟動
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串口終端中的使用問題,確保服務器可控運行及終端輸入正常。