2016-10-17 7 views
1

Я пытаюсь создать потоковое приложение, используя boost с iostream, но сервер не отделяет кадр изображения в цикле приема, получает все в одном файле (не закрывает файл и продолжает получать другие фреймы в том же файле). Единственное решение, которое я смог найти, было отправлено фреймом для подключения, но он очень медленно течет.Отправить несколько файлов на одно соединение с boost iostream

в настоящее время отправки 1 файл на подключение и все работает (медленно в удаленных сетях)

я хочу, чтобы изменить его, чтобы отправить несколько файлов за соединение (я думаю, что у меня будет выигрыш в производительности), но я имея указанную выше проблему.

«/tmp/img.frame» должны быть перезаписаны

ниже код я использую (изменено только, чтобы сделать одно соединение)

void send_() 
{ 
    boost::scoped_ptr<screenshot> ptr_screen(new screenshot); 
    handle_connection = true; 

    boost::asio::io_service svc; 

    boost::asio::ip::tcp::iostream stream_(boost::asio::ip::tcp::resolver::query{ "127.0.0.1", "6293" }); 

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

    while (handle_connection) { 
     ptr_screen->Start(); // get screen.jpg 

     std::ifstream ifs("screen.jpg", std::ios::binary); 
     out << ifs.rdbuf(); 
     out.flush(); 
     ifs.close(); 
    } 
} 


void receiver_() 
{ 
    connection_handle = true; 
    try 
    { 
     boost::asio::io_service io_service; 

     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 6293); 
     boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint); 

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

     if(!stream) { return; }    

     boost::iostreams::filtering_istream in; 
     in.push(boost::iostreams::zlib_decompressor()); 
     in.push(stream); 

     while(connection_handle) 
     {  
      std::ofstream ofs("/tmp/img.frame", std::ios::binary); // must be overwritten 
      copy(in, ofs); 
      ofs.close(); 
     } 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "\n[-] " << e.what() << std::endl; 
    } 
} 

ответ

2

Независимо от используемой технологии, вы должны понимать, что TCP. Является потоковым протоколом без сообщений. Если вы хотите отправить отдельные сообщения любого рода и они выбрали друг от друга правильно на уходящем конце концов, вы должны реализовать протокол приложения некоторого вида:

  • Приставка длиной слова
  • тип длиной значение
  • STX/ETX, вытекания во всех деталях
  • самостоятельного описания протокола, такого как XML

и т.д. и т.п. и т.д.