У меня есть встроенное устройство Linux, которое прослушивает UDP-пакеты.
Устройство имеет два интерфейса Ethernet, поэтому пакеты могут быть получены на обоих интерфейсах.
На определенных UDP-сообщениях / пакетах я должен сделать что-то определенное для интерфейса, на котором он был получен. Поэтому мне нужно определить, какой интерфейс получил пакет.
Я нашел сообщения и примеры в Stackoverflow, показывающие, как извлечь целевой IP из IP_PKTINFO
. Это работает нормально, если я тестирую интерфейсы один за другим. При подключении обоих интерфейсов и получении IP-адреса назначения совпадает.
Я заметил, что ifindex
не то же самое, но я не понимаю, почему ipi_spec_dst
одинаково, когда я ясно получаю пакет на двух разных интерфейсах с двумя разными IP-адресами.
C / C ++ Код, отвечающий за извлечение IP-адреса назначения:
ssize_t byteCount=recvmsg(f_socket, &message, 0);
if (byteCount==-1) {
printf("%s",strerror(errno));
}
for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&message);
cmsg != NULL;
cmsg = CMSG_NXTHDR(&message, cmsg))
{
if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) continue;
struct in_pktinfo *pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
char* destAddr = (char*) calloc(4, sizeof(char));
destAddr = inet_ntoa(pi->ipi_spec_dst);
std::cout << destAddr << " " << std::to_string(pi->ipi_ifindex) << std::endl;
}
Подключен выход eth0:
172.20.55.9 4
172.20.55.9 4
172.20.55.9 4
...
Выход eth0 подключен:
200.0.0.101 6
200.0.0.101 6
200.0.0.101 6
...
Выходные данные eth0 и eth1 подключены:
172.20.55.9 6
172.20.55.9 4
172.20.55.9 6
172.20.55.9 4
...
Ожидаемый результат:
200.0.0.101 6
172.20.55.9 4
200.0.0.101 6
172.20.55.9 4
...
Прежде всего, я не уверен, ожидается ли это или нет, я не думаю, что это так, но, возможно, я не правильно понял документацию.
Я могу предоставить больше кода при необходимости.
Код взят из:
- Получение адреса назначения пакета UDP
- Получить адрес назначения полученного пакета UDP
Любая помощь очень ценится. Спасибо.
-aln