繁体   English   中英

通过套接字传输文件时文件损坏

[英]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>

如果仍然有问题,我建议对源文件和复制的文件进行二进制比较(大多数十六进制编辑器都可以这样做)。 这应该使您更好地了解差异的确切位置以及可能导致差异的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM