Как узнать целевой адрес и порт при получении пакета UDP с помощью libuv?

uvlib UDP принимает функцию обратного вызова события следующего типа:

typedef void (*uv_udp_recv_cb)(uv_udp_t* handle,
                               ssize_t nread,
                               const uv_buf_t* buf,
                               const struct sockaddr* addr,
                               unsigned flags);

Нет информации о целевом порте и адресе типа sent_to_addr. Есть ли способ достичь этого?

Мне это нужно, чтобы узнать, на каком интерфейсе получен пакет, или узнать группу многоадресной рассылки. Сокет прослушивает 0.0.0.0:xxxx


person kyb    schedule 21.11.2016    source источник


Ответы (3)


IP_PKTINFO содержит такую ​​информацию, но libuv не предоставляет API, который позволяет это сделать.

person Iñaki Baz Castillo    schedule 21.11.2016

Да, @Инаки, верно. Я обнаружил ошибки в node.js репозитории. Они активны годами. Этот запрос функции до сих пор не решен из-за проблем с переносимостью.

Есть обходные пути:

  1. для multicast -> привязать к многоадресному адресу.
  2. для unicast -> привязка к конкретному локальному интерфейсу, 1 интерфейс - 1 сокет. Но имейте в виду, что в этом случае динамические адреса могут стать ловушками
person kyb    schedule 21.11.2016

Быстрый поиск показывает аналогичный вопрос: Получить адрес назначения полученного UDP-пакета Вы можете напрямую вызвать системный API для получения информации, не нужно привязываться к конкретному адресу.

person user2760751    schedule 22.11.2016
comment
Я прочитал это. Обход libuv нарушает переносимость! Но в конкретном случае это может быть полезно. - person kyb; 22.11.2016