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

Linux C Socket 抓取網頁保存亂碼:recv 返回值與 fwrite 長度不匹配

     編輯:程式設計綜合問答

問題代碼

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 處停止,導致寫入長度小於實際接收長度,文件截斷或內容錯誤。

修正代碼

ssize_t recvSize;
while ((recvSize = recv(sockfd, recvBuf, BUF_SIZE, 0)) > 0) {
    fwrite(recvBuf, 1, recvSize, fp); // 直接用 recvSize
    // 若需打印文本,可臨時添加 \0 但不影響寫入
    recvBuf[recvSize] = '\0';
    printf("%s", recvBuf);
    // memset 可選,下次循環會覆蓋
}

補充建議

  • HTTP 響應可能為 Chunked 編碼或 gzip 壓縮,需解析 Header 確定 Content-Length 或解碼 Body。
  • 建議使用成熟庫 libcurl 直接下載,避免手寫 HTTP 協議解析。
  • 文件打開模式用 "wb" 二進制寫入,防止換行符轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved