2016-10-17 2 views
1

Ich versuche, eine Streaming-Anwendung mithilfe von Boost mit Iostream zu machen, aber der Server trennt nicht den Bildrahmen in der Empfangsschleife, wird alles in einer Datei (schließt nicht die Datei und erhält weiterhin die anderen Frames in der gleichen Datei). Die einzige Lösung, die ich finden konnte, wurde ein Frame für die Verbindung gesendet, aber lässt das Streaming sehr langsam.Mehrere Dateien pro Verbindung mit Boost Iostream senden

derzeit Senden 1 Datei pro Verbindung und alles funktioniert (langsam auf Remote-Netzwerken)

ich will, es ändern, mehrere Dateien pro Verbindung zu senden (ich glaube, ich werde einen Gewinn in der Leistung haben), aber ich bin das oben erwähnte Problem haben.

die "/tmp/img.frame" muss

unter dem Code überschrieben Ich verwende (geändert nur eine Verbindung herstellen können)

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

Antwort

2

Unabhängig von der zugrunde liegenden Technologie, Sie müssen erkennen, dass TCP. Ist ein Streaming-Protokoll ohne Nachricht. Wenn Sie einzelne Nachrichten jeglicher Art senden möchten, und haben sie auseinander richtig am fliehenden Ende nahm, müssen Sie ein Anwendungsprotokoll von einer Art implementieren:

  • Länge Wort Präfix
  • Typ-Länge-Wert
  • STX/ETX, mit in allen Einzelheiten zu entkommen
  • selbstbeschreibende Protokolle wie XML

etc. etc. etc.

Verwandte Themen