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 可選,下次循環會覆蓋
}
Chunked 編碼或 gzip 壓縮,需解析 Header 確定 Content-Length 或解碼 Body。libcurl 直接下載,避免手寫 HTTP 協議解析。"wb" 二進制寫入,防止換行符轉換。