文件在通过套接字传输时损坏
File gets corrupted when transferring it via socket
我的Java客户端使用以下代码向c++服务器发送一个文件:
FileInputStream fileInputStream = new FileInputStream(path);
byte[] buffer = new byte[64*1024];
int bytesRead = 0;
while ( (bytesRead = fileInputStream.read(buffer)) != -1)
{
if (bytesRead > 0)
{
this.outToServer.write(buffer, 0, bytesRead);
}
}
我的c++服务器使用以下代码接收字节:
vector<char> buf5(file_length);
size_t read_bytes;
do
{
read_bytes = socket.read_some(boost::asio::buffer(buf5,file_length));
file_length -= read_bytes;
}
while(read_bytes != 0);
string file(buf5.begin(), buf5.end());
然后用下面的代码创建文件:
ofstream out_file( (some_path).c_str() );
out_file << file << endl;
out_file.close();
然而,不知何故,文件在此过程中损坏。
在流程结束时,两个文件(发送的和创建的)具有相同的大小。
我做错了什么?任何帮助将不胜感激!
编辑:尝试使用不同的代码来接收文件,结果相同:
char buf[file_length];
size_t length = 0;
while( length < file_length )
{
length += socket.read_some(boost::asio::buffer(&buf[length], file_length - length), error);
}
string file(buf);
1)它是一个文本文件吗?
2)如果在写入前没有尝试以二进制模式打开文件,也不要使用<<操作符,而使用write或put方法
在您的第一个示例中,问题似乎是这一行:
read_bytes = socket.read_some(boost::asio::buffer(buf5,file_length));
这将导致您覆盖字符串的前N个字节,并且不能正确地附加多个读。
在第二个例子中,问题很可能是:
string file(buf);
如果buf
包含任何NUL字符,则该字符串将被截断。使用与第一个示例中相同的字符串创建std::vector<char>
。
如果您仍然有问题,我建议对源文件和复制文件进行二进制差分(大多数十六进制编辑器可以做到这一点)。这可以让您更好地了解差异的确切位置以及可能导致差异的原因。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- Angelscript从C++传输数组
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 从服务器传输到客户端的消息不会出现
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- USB传输的LibUSB C++格式不同
- 使用全局声明的向量时,C++双重释放错误/损坏
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 将相机数据从服务器实时流式传输到客户端
- 加密在 Windows、C++ 和 Java 中传输中的数据
- 变量周围的堆栈'...'已损坏
- 在UDP(MPEGTS)中流式传输时FFMPEG损坏的帧
- 文件在通过套接字传输时损坏