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

File gets corrupted when transferring it via socket

本文关键字:传输 损坏 套接字 文件      更新时间:2023-10-16

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

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