Поиск отправителя многоадресного UDP-пакета при использовании WSARecvMsg - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь получить IP-адрес отправителя многоадресного пакета, а также адрес / интерфейс назначения, на который был отправлен многоадресный пакет.

При получении многоадресного пакета через recvfrom(SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen) возвращает IP отправителей через параметр from, однако информация об адресе, на который отправляется пакет, не предоставляется.

Чтобы преодолеть этот недостаток recvfrom(), я попытался использовать WSARecvMsg(), который предположительно предоставляет всю необходимую информацию. Все ответы на другие вопросы кажутся очень уверенными в том, что всю необходимую информацию можно получить, используя (по крайней мере, * nix) метод recvmsg.

При получении пакета с WSARecvMsg() и проверке структуры IN_PKTINFO он содержит следующее:

typedef struct in_pktinfo {
  IN_ADDR ipi_addr;
  ULONG   ipi_ifindex;
} IN_PKTINFO, *PIN_PKTINFO

И из документации элемент ipi_addr является адресом назначения, а ipi_ifindex является интерфейсом, на котором он был получен.

Из вышесказанного кажется, что WSARecvMsg() может предоставить только другую половину (т.е. адресата), но не информацию об отправителях.

Я что-то упустил? Или есть другой способ получить информацию, которую я хочу, желательно без использования необработанных сокетов?

...