C语言实现FTP协议STOR命令接收文件出现冗余乱码如何解决
核心问题
你代码的核心错误是fwrite写入长度参数使用错误:read返回的bytes_read是本次实际从socket读取到的有效字节数,而你每次都固定写入sizeof(buffer)(即4096字节),最后一次读取大概率读不满4096字节,buffer中未被新数据覆盖的残留垃圾数据就会被写入文件,就是你看到的末尾乱码。
修复后的代码示例
int rec_file(char *filename, int sockfd){ ssize_t bytes_read; char buffer[4096]; // 新增fopen失败判断,避免空指针崩溃 FILE *f = fopen(filename, "wb"); if (f == NULL) { return -1; } while ((bytes_read = read(sockfd, buffer, sizeof(buffer))) > 0){ // 改成写入实际读到的bytes_read字节,而非固定4096字节 fwrite(buffer, 1, bytes_read, f); } // 新增read错误判断,处理网络异常场景 if (bytes_read < 0) { fclose(f); return -2; } fclose(f); return 0; }
额外优化建议
- 存储
read返回值的变量建议使用ssize_t类型而非int,符合POSIX接口定义,避免大文件传输时的溢出风险 - 实际FTP协议实现中,STOR命令需要先判断客户端协商的传输模式(二进制/ASCII),如果是ASCII模式还需要对换行符做平台兼容转换,避免文本文件跨平台打开格式错乱
内容的提问来源于stack exchange,提问作者felixoben
相关产品推荐
相关产品推荐

