async_read() Boost::Asio C++

297
27 марта 2017, 09:29

Здравствуйте. Нужно принять строку от клиента через tcp соединение. Пример строки в 16 формате:

00 08 80 00 00 80 CD CD

Рабочий метод:

char buffer[10];
async_read(socket_, asio::buffer(buffer, 8)
        , [](boost::system::error_code const & error, size_t bytes_xfer){});

Но проблема в том, что размер пакета всегда разный. Поэтому это не подходит.

Пробовал вот так:

streambuf buf;
    async_read(socket_, buf
    , [](
      boost::system::error_code const & error, size_t bytes_xfer){});

Получаю исключение в файле basic_streambuf.hpp

void commit(std::size_t n)
  {
    if (pptr() + n > epptr()) //тут
      n = epptr() - pptr();
    pbump(static_cast<int>(n));
    setg(eback(), gptr(), pptr());
  }

Exception thrown at 0x66D067FD (msvcp140d.dll) in TOPEmulator.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

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

      class TCPSession
        {
        ...
        private:
            std::unique_ptr<char> receive_buffer_;
        }
        void TCPSession::read_packet_len()
        {
            receive_buffer_.reset(new char[2]());
            async_read(socket_, asio::buffer(receive_buffer_.get(), 2)
                , [my = shared_from_this()](
                  boost::system::error_code const & error, size_t bytes_xfer){
                my->read_packet();
            });
        }
        void TCPSession::read_packet()
        {
            uShort datalen = 0;
            memcpy((char*)&datalen, receive_buffer_.get(), 2);
            boost::endian::endian_reverse_inplace<uShort>(datalen);
            std::cout << "datalen: " << datalen << endl; // результат 8
            receive_buffer_.reset(new char[datalen -2]());
                async_read(socket_, asio::buffer(receive_buffer_.get(), datalen - 2), 
    [my=shared_from_this()](boost::system::error_code const & error, size_t bytes_xfer)
       {/*проверяю считанные символы*/});
        }

Если использовать библиотеку "POCO", то все работает.

receiveBytes();
READ ALSO
incomplete type used in nested name specifier

incomplete type used in nested name specifier

Добрый день показывает мне вот такую ошибкy: incomplete type Team used in nested name specifier вот код maincpp

382
Изменение порядка свойств в объекте JS

Изменение порядка свойств в объекте JS

Есть два сервера, которые используют одну и ту же БД, но имеют разные способы работы к нейС первого сервера получаю следующий объект:

343
В чем проблема? missing ) after argument list [требует правки]

В чем проблема? missing ) after argument list [требует правки]

Где ошибка? При наведении на star-5 меняет background-position, если убираю мышь с star-5, то должна быть проверка (если star-5 не checked, то меняем background-position) Где...

253
Изменение курсора на странице на свой. JS

Изменение курсора на странице на свой. JS

На стандартные курсоры я сделал кнопку, при нажатии вызывается функция аргументом которой является имя курсора; В функции присваивается...

259