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

时间:2014-03-18 11:38:14

标签: java c++ sockets boost-asio

我的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);

2 个答案:

答案 0 :(得分:2)

1)是文本文件吗? 2)如果没有尝试在写入之前以二进制模式打开文件,也不要使用&lt;&lt;运算符,而是使用write或put方法

答案 1 :(得分:0)

在您的第一个示例中,问题似乎是这一行:

read_bytes = socket.read_some(boost::asio::buffer(buf5,file_length));

这会导致您覆盖字符串的前N个字节,而不是正确附加多个读取。

在你的第二个例子中,问题很可能是:

 string file(buf);

如果buf包含任何NUL字符,则字符串将被截断。使用与第一个示例中相同的字符串创建std::vector<char>

如果您仍有问题,我建议您对源文件和复制文件进行二进制差异处理(大多数十六进制编辑器可以执行此操作)。这可以让您更好地了解差异的确切位置以及可能导致差异的原因。