問題代碼
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 解析。