2016-10-07 2 views
3

ブーストiostreamソケットを使用してファイルを送受信しようとしています。ファイルの内容を読み込んでストリームに送信する最も効率的な方法は何ですか?そして、サーバー側でこのコンテンツを読んでファイルに書き込む方法は?ブーストiostreamソケットでファイルを読み書きする

を送る:

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

std::ifstream fs; 
fs.open("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; 
     of.open("rcv.jpg", std::ios::binary); 

     // read the file content with stream 
     // write content to file 
    } 
} 
+0

どのような意味で効率的ですか? –

+1

@DanMašek私は(以前の質問から)大きなファイル(すなわちストリーミング)のためにメモリ要件が大きくならないと仮定しています – sehe

答えて

3
私はドキュメントの例から欠落している部分に充填

http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp03/iostreams/daytime_server.cpp

はここに(と思うが)何を期待し、単純な送信側/受信側のプログラムです:

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 { "127.0.0.1", "6768" }); 

    boost::iostreams::filtering_ostream out; 
    out.push(boost::iostreams::zlib_compressor()); 
    out.push(sockstream); 

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

void receiver() { 

    int counter = 0; 
    try 
    { 
     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; 
       in.push(boost::iostreams::zlib_decompressor()); 
       in.push(stream); 

       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; 
     exit(255); 
    } 
} 

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

あなたが受信機を実行すると:

./test 

と使用します送信者数回:

./test sender 

受信者は、受信したファイルを解凍してtest0.out、test1.outなどに書き出します。

+0

svcを作成しますが、どこでも使用しないでください – CashCow

+0

そして、それは何か他の人に答えます:( – CashCow

+0

@CashCow良い点(私は、サービスなしで働くことができるAsioのことが分かりませんでしたので、私がインスタンス化する最初のことです)習慣:あなた自身の質問をする時間。あなたがここで読んでいたかったものを推測することはできません。 – sehe

関連する問題