Как прочитать только часть сокета udp в boost :: asio? - PullRequest
0 голосов
/ 13 февраля 2019

В boost :: asio :: tcp я могу использовать boost::asio::read для чтения только части сокета tcp.

boost::system::error_code error;
boost::asio::streambuf len_buffer;
size_t n = boost::asio::read(tcp_socket, len_buffer, boost::asio::transfer_exactly(1), error);

Но функция boost::asio::read не работает с udp::socket.

Тогда как читать только некоторую часть сокета udp, например, только чтение 1 байтапоток сокетов?

Я проверил функцию receive(), но она не принимает параметр длины.Сокет udp поддерживает частичное чтение вообще?

1 Ответ

0 голосов
/ 13 февраля 2019

Точнее, третий параметр read не является параметром длины, это условие завершения.Если это условие истинно, операции чтения / записи отменяются.udp::socket::receive не принимает этот параметр, потому что он имеет смысл при использовании с streambuf.udp::socket::receive имеет 3 перегрузки, и ни одна из них не принимает streambuf.Все берут MutableBufferSequence, где хранятся входящие данные.При создании буфера для хранения данных вам необходимо указать размер этого буфера. Этот размер определяет, сколько байтов будет прочитано .Так что в вашем случае вам нужно подготовить буфер объемом 1 байт.Есть много способов сделать это, буфер .

boost::asio::ip::udp::socket sock{io,ep};
boost::asio::ip::udp::endpoint from;

// array of POD
char buf[1]; // 1 byte array
sock.receive_from(boost::asio::buffer(buf),from);

// pointer to POD
char buf2; // sizeof (char) == 1
sock.receive_from(boost::asio::buffer(&buf2,1),from);

// vector
std::vector<char> buf3(1); // 1 byte length
sock.receive_from(boost::asio::buffer(buf3),from);
...