2013-10-07 3 views
0

Я пытаюсь использовать boost :: asio для моего нового проекта маленького хобби, но у меня возникают проблемы с получением сервера для чтения правильных данных. Отправка его выполняется нормально, я проверил с помощью wirehark и отправил байты [0 0 0 4], а затем [5 0 0 0]. Но на стороне сервера я получаю [16 -19 105 0], что делает меня довольно запутанным.Получение неверных данных с boost :: asio socket

Вот как я посылаю его, прекрасно работает, если смотреть через Wireshark:

boost::asio::io_service io; 
tcp::resolver resolver(io); 
tcp::resolver::query query("localhost", boost::lexical_cast<string>("40001")); 
tcp::resolver::iterator endpoints = resolver.resolve(query); 
tcp::socket socket(io); 
boost::asio::connect(socket, endpoints); 
header h(5); 
header::storage data = h.store(); 
boost::asio::write(socket, boost::asio::buffer(&data[0], header::header_size())); 

Это урезанная версия моего класса сервера. handle_read_header вызывается с правильным количеством байтов, но headerbuffer содержит странные значения, [16 -19 105 0].

class tcp_connection : public boost::enable_shared_from_this<tcp_connection> 
{ 
public: 
    tcp_connection(boost::asio::io_service& io) 
     : _socket(io) 
    { 
     memset(&headerbuffer[0], 0, headerbuffer.size()); 
    } 

    void start() { 
     _socket.async_read_some(boost::asio::buffer(&headerbuffer[0], header::header_size()), boost::bind(&tcp_connection::handle_read_header, this, 
                           boost::asio::placeholders::error, 
                           boost::asio::placeholders::bytes_transferred)); 
    } 
    void handle_read_header(const boost::system::error_code& error, std::size_t numBytes) { 
     if(!error) { 
      BOOST_LOG_SEV(logger, loglvl::debug) <<"handle_read_header, " <<numBytes <<"/" <<header::header_size() <<" bytes"; 
      if (numBytes == header::header_size()) { 
       std::stringstream ss; 
       for(u32 a = 0; a < numBytes; ++a) { 
        ss <<(int)headerbuffer[a] <<" "; 
       } 
       BOOST_LOG_SEV(logger, loglvl::debug) <<"header data: " <<ss.str(); 
       mCurrentHeader.load(headerbuffer); 
       mRemaining = mCurrentHeader.size(); 
       BOOST_LOG_SEV(logger, loglvl::debug) <<"got header with size " <<mCurrentHeader.size(); 
      } 
     } else { 
      BOOST_LOG_SEV(logger, loglvl::debug) <<"error " <<error; 
     } 
    } 
private: 
    header mCurrentHeader; 
    std::array<char, 128> headerbuffer; 
    boost::asio::ip::tcp::socket _socket; 
}; 

(почти) полный код можно найти на http://paste2.org/U97HHaH3

+0

Обязательно проверьте код ошибки. Также убедитесь, что 'sizeof (header)' оценивает то, что, по вашему мнению, он оценивает; он может иметь отступы. –

+0

Код обновлен, ветвь ошибки не выполняется. Хороший наконечник на sizeof, заменил его. – dutt

+0

Теперь это странно. Кажется, что-то странно. Если я заставлю сервер работать и запустить клиент дважды, во втором запуске я получаю [0 0 0 4] на сервере. – dutt

ответ

0

Он оказался трусливым, но в то же время очевидным, ошибка. tcp_connection :: ptr является shared_ptr. В tcp_server.h я вызываю start() на нем, но тогда ничего не ссылается на него, что делает shared_ptr разумным, предположим, что его можно удалить. Таким образом, функция запущена, но переменные-члены были очищены.

Не знаю, почему это сработало некоторое время, но я предполагаю, что это в стране неопределенного поведения.

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