Question

My Java client sends a file to a C++ server using this code:

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);
     }   
}

My C++ server receives the bytes using this code:

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());

And then creates the file using this code:

ofstream out_file( (some_path).c_str() );
out_file << file << endl;
out_file.close();

However, somehow the file gets corrupted during this process.
At the end of the process, both files(the one sent and the one created) have the same size.

What am I doing wrong? Any help would be appreciated!

Edit: tried to use different code for receiving the file, same result:

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);
Was it helpful?

Solution

1) is it a text file?
2) if not try opening the file in binary mode before writing, also do not use << operator, instead use write or put methods

OTHER TIPS

In your first example the problem appears to be this line:

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

This results in you overwriting the first N bytes of your string and not appending multiple reads correctly.

In your second example the problem is likely:

 string file(buf);

If buf contains any NUL characters then the string will be truncated. Use the same string creation as in your first example with a std::vector<char>.

If you still have problems I would recommend doing a binary diff of the source and copied files (most hex editors can do this). This should give you a better picture of exactly where the difference is and what may be causing it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top