Класс конечной точки ускорения Asio - PullRequest
0 голосов
/ 20 марта 2019

Как описано в документации по бусту:

ip::basic_endpoint::port (1 of 2 overloads)
unsigned short port() const;

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

Я знаю, что порядок байтов Little-endian размещает младший байт первым. Тем не менее, порядок байтов с байтовым порядком байтов ставит самый старший байт первым.

на языке C, мы используем эти функции:

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

Как получить правильный номер порта в boost asio?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Проблема в том, что UDP - это протокол без установления соединения. Поэтому remote_endpoint содержит мусор после отправки данных.

Код, подтверждающий, что

boost::system::error_code ec;
boost::asio::ip::udp::endpoint endpoint = socket.remote_endpoint(ec);
if(ec)
{
    std::cout << "An error occurred." << '\n';
    std::cout << ec.value() << " " << ec.message() << '\n';
    return;
}

вывод:

Произошла ошибка. 107 Транспортная конечная точка не подключена

0 голосов
/ 20 марта 2019

https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/reference/ip__basic_endpoint/port.html

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

Итак, поскольку вы вызываете функцию на этом хосте, просто вызов функции возвращает вам правильный порт.

Полагаю, этот «странный» комментарий возник, когда авторы библиотеки реализовывали нижние уровни некоторых протоколов / думали о необработанных сокетах. Просто предупреждение, что вам нужно выполнить преобразование в сетевой порядок байтов, если вы реализуете определенные протоколы. Это делает комментарий почти полностью избыточным на уровне абстракции, который обеспечивает basic_endpoint, но кто знает, может быть, это было то, что кто-то забыл придерживаться однажды при его реализации (специализация).

...