首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

TCP 通訊中服務端回覆客戶端收不到:緩衝區長度不匹配導致的發送/接收越界

     編輯:程式設計綜合問答

現象

客戶端發送結構體 gksakura(含 int a; char b[32];,共 36 字節),服務端收到後回覆 "get it!"(8 字節),但客戶端 recv 陷塞或收到亂碼。

根因:長度硬編碼 128 導致越界

方向代碼實際數據長度傳入長度後果
客戶端發送send((char*)&gk, 128)36 字節128讀越界,發送垃圾內存
客戶端接收recv(ans, 128)8 字節128寫越界,棧損壞
服務端接收recv((char*)&gk, 128)36 字節128寫越界
服務端發送send(ans, 128)8 字節128讀越界

修正代碼

// 客戶端
auto errcode = gksock->send((char*)&gk, sizeof(gk));      // 36
gksock->recv(ans, sizeof(ans));                           // 64

// 服務端
errcode = recv(sClient, (char*)&gk, sizeof(gk), 0);       // 36
errcode = send(sClient, ans, strlen(ans), 0);             // 8 (不含 \0) 或 sizeof(ans)

最佳實踐

  1. 永遠使用 sizeof(結構體變量) 或 strlen(字符串),拒絕魔數。
  2. 應用層協議加上「長度前綴」或「分隔符」,實現粘包/拆包處理。
  3. 啟用編譯器 /RTCs (棧框檢查) 或 AddressSanitizer,自動捕獲越界。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved