Client 端 recv 一直收不到資料,或比預期延遲一輪。經排查發現發送端使用 scanf("%s\n", cmd) 讀取指令。
scanf("%s\n", cmd) 中的 \n 會讓 scanf **持續讀取並丟棄空白字元(包含換行、空格、Tab)**,直到遇到非空白字元才返回。導致程式卡在等待「下一個非空白字元」,實際上資料已發送完畢,只是 scanf 沒有返回,後續發送邏輯無法執行。
// 錯誤
scanf("%s\n", cmd);
// 正確:移除 \n,%s 已自動跳過前導空白並讀取到下一個空白
scanf("%s", cmd);
// 更安全:限制長度防止緩衝區溢位
scanf("%255s", cmd); // 假設 cmd[256]
char line[1024];
while (fgets(line, sizeof(line), stdin)) {
line[strcspn(line, "\r\n")] = 0; // 去除換行
if (strlen(line) == 0) continue;
// 解析 line,如 sscanf(line, "%s %d", cmd, &arg)
send(sock, line, strlen(line), 0);
}
select/poll/epoll 同時監聽 stdin 與 socket,實現真正的並發互動。一個多餘的 \n 讓 scanf 吞噬了後續輸入機會,導致發送邏輯「慢一拍」甚至卡死。**網路程式輸入處理請拋棄 scanf,改用 fgets 或非阻塞事件模型**,才能構建健壯的通訊客戶端。