Здравствуйте. Нужно принять строку от клиента через 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();
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день показывает мне вот такую ошибкy: incomplete type Team used in nested name specifier вот код maincpp
Есть два сервера, которые используют одну и ту же БД, но имеют разные способы работы к нейС первого сервера получаю следующий объект:
Где ошибка? При наведении на star-5 меняет background-position, если убираю мышь с star-5, то должна быть проверка (если star-5 не checked, то меняем background-position) Где...
На стандартные курсоры я сделал кнопку, при нажатии вызывается функция аргументом которой является имя курсора; В функции присваивается...