Melissia_M Melissia_M - 1 year ago 336
C++ Question

Reading and writing files with boost iostream socket

I'm trying to send and receive files using boost iostream sockets. what is the most efficient way to read the contents of the file and then send to stream? And how to read this content on the server side and write to file?


boost::asio::io_service svc;
using boost::asio::ip::tcp;
tcp::iostream sockstream(tcp::resolver::query{ "", "3780" });

std::ifstream fs;"img.jpg", std::ios::binary);
sockstream << // send file to stream


boost::asio::io_service ios;

boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 3780);
boost::asio::ip::tcp::acceptor acceptor(ios, endpoint);

for (;;)
boost::asio::ip::tcp::iostream stream;
boost::system::error_code ec;
acceptor.accept(*stream.rdbuf(), ec);

if (!ec) {
std::ofstream of;"rcv.jpg", std::ios::binary);

// read the file content with stream
// write content to file

Answer Source

I filled in the missing pieces from the documentation example:

Here's a simple sender/receiver program that (I think) does what you expect:

Live On Coliru

#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <fstream>
using boost::asio::ip::tcp;

void sender() {
    boost::asio::io_service svc;

    tcp::iostream sockstream(tcp::resolver::query { "", "6768" });

    boost::iostreams::filtering_ostream out;

        std::ifstream ifs("main.cpp", std::ios::binary); // pretend this is your JPEG
        out << ifs.rdbuf();

void receiver() {

    int counter = 0;
        boost::asio::io_service io_service;

        tcp::endpoint endpoint(tcp::v4(), 6768);
        tcp::acceptor acceptor(io_service, endpoint);

        for (;;)
            tcp::iostream stream;
            boost::system::error_code ec;
            acceptor.accept(*stream.rdbuf(), ec);

                boost::iostreams::filtering_istream in;

                std::ofstream jpg("test" + std::to_string(counter++) + ".out", std::ios::binary);
                copy(in, jpg);

            // break; // just for shorter demo
    catch (std::exception& e)
        std::cerr << e.what() << std::endl;

int main(int argc, char**argv) {
    if (--argc && argv[1]==std::string("sender"))

When you run the receiver:


And use the sender several times:

./test sender

The receiver will decompress and write the file received to test0.out, test1.out etc.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download