2013-12-04 3 views
0

Вот мой код:подталкивания ASIO, async_read ошибка

void do_read_header() 
    { 
     std::string incoming_header; 

     boost::asio::async_read(socket_, boost::asio::buffer(incoming_header, incoming_header.length()), [this, incoming_header](boost::system::error_code ec, std::size_t) 
     { 
      if (!ec && check_message(incoming_header)) 
      { 
       do_read_body(); 
      } 
      //else 
      //{ 
      // socket_.close(); 
      //} 
     }); 
    } 

    void do_read_body() 
    { 
     std::string incoming_message; 

     boost::asio::async_read(socket_, boost::asio::buffer(incoming_message, incoming_message.length()), [this, incoming_message](boost::system::error_code ec, std::size_t) 
     { 
      if (!ec) 
      { 
       std::cout.write(incoming_message.c_str(), incoming_message.length()); 
       std::cout << "\n"; 
       //do_read_header(); 
      //} 
      //else 
      //{ 
       socket_.close(); 
      } 
     }); 
    } 

Это модифицированная версия этого: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp

Что случилось с моим кодом?

+0

какая ошибка у вас возникла? Объясните crearly ,, –

+0

нашел это, incoming_header должен быть char * ... – Zerox

+0

что самое быстрое с точки зрения скорости выполнения способ преобразования строки в char * – Zerox

ответ

0

Одна из проблем заключается в том, что incoming_header и incoming_message являются локальными переменными, уничтоженными до выполнения обработчика завершения. Вы захватываете их копию, пока они еще пусты; то операция будет записывать освобожденную память, что приведет к неоправданному хаосу.

Один из вариантов, если вам нужно только прочитать одно сообщение за раз, заключается в использовании переменной-члена, а не локальной переменной, и только для записи this. В качестве альтернативы вы можете динамически распределять буфер, не забывая удалить его в обработчике.

В любом случае, убедитесь, что вы предварительно изменили размер буфера или, возможно, используете boost::asio::streambuf, чтобы читать произвольные суммы. Вы инициализируете буфер нулевым размером, поэтому никогда не получите никаких данных, даже если вы не уничтожили буфер.

Смежные вопросы