如何在C脚本中查看send()发送的LAN数据并正确写入文件?
解决send发送内容写入文件乱码的问题
先明确几个核心问题,再给你对应的解决方法:
可能的乱码原因及对应方案
文件打开模式错误
如果buffer里是二进制数据(比如网络传输的协议报文、非文本数据),用文本模式("w")打开文件会导致系统自动转换换行符(比如Windows下把\n转为\r\n),破坏原始数据。必须用二进制模式打开:FILE *fptr = fopen("sent_data.bin", "wb"); if (!fptr) { perror("Failed to open file"); // 处理错误逻辑 }错误使用预期发送长度而非实际发送长度
send函数的返回值才是实际成功发送的字节数,网络环境下可能无法一次性发送n*16字节。如果你直接用n*16作为fwrite的长度,会写入buffer中未被发送的无效数据,导致乱码:ssize_t actual_sent = send(sock_client, buffer, n * 16, MSG_NOSIGNAL); if (actual_sent == -1) { perror("Send failed"); fclose(fptr); // 处理错误逻辑 } // 只写入实际发送的字节数 size_t written = fwrite(buffer, 1, actual_sent, fptr); if (written != actual_sent) { perror("Failed to write all data to file"); }buffer数据被篡改或释放
确保执行fwrite时,buffer仍然是有效的(比如不是栈上的临时变量已被销毁,或者被其他代码覆盖)。如果send和fwrite之间有其他操作修改了buffer,也会导致写入错误数据。
验证数据正确性
如果写入的是二进制数据,用普通文本编辑器打开必然会显示乱码——这是正常现象。你需要用十六进制编辑器(比如Linux的xxd命令、Windows的HxD工具)查看文件内容,对比buffer的原始十六进制值来验证是否正确。
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

