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

Linux C Socket 接收數據保存文件亂碼:strlen 遇 \0 截斷導致長度錯誤

     編輯:程式設計綜合問答

問題代碼

while (recvSize = recv(sockfd, recvBuf, BUF_SIZE, 0) > 0) {
    fwrite(recvBuf, sizeof(char), strlen(recvBuf), fp); // ❌ strlen 遇 \0 返回
    printf("%s", recvBuf);
    memset(recvBuf, 0, sizeof(recvBuf));
}

根因

  • recv 返回實際接收字節數(recvSize),數據中可能包含 \0;
  • strlen 遇第一個 \0 終止,**返回值 ≤ 實際長度**,導致 fwrite 寫入不完整、文件截斷;
  • 二進制數據(圖片、壓縮包)必含 \0,不可用字符串函數處理。

修正代碼

ssize_t recvSize;
while ((recvSize = recv(sockfd, recvBuf, BUF_SIZE, 0)) > 0) {
    fwrite(recvBuf, 1, recvSize, fp); // ✅ 直接用 recv 返回值
    // 若需打印文本,可臨時加 \0:recvBuf[recvSize] = '\0'; printf("%s", recvBuf);
}

最佳實踐

  • 網絡編程**始終使用接收返回值**作為有效長度;
  • 區分文本協議(可用字符串函數)與二進制協議(必須用長度);
  • HTTP 響應頭以 \r\n\r\n 分隔,體部按 Content-Length 或 Transfer-Encoding: chunked 解析。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved