Я пытаюсь изменить пример многоадресного прослушивателя/отправителя, чтобы привязать UDP/многоадресный сокет к определенному интерфейсу и не использовать INADDR_ANY макрос.
У меня есть адрес IPv4 интерфейса. Я попробовал следующее, но сокет не получает никаких UDP (одноадресных, широковещательных, многоадресных) пакетов.
struct sockaddr_in addr;
int fd, nbytes;
socklen_t addrlen;
struct ip_mreq mreq;
// my_ipv4Addr equals current IP as String, e.g. "89.89.89.89"
// create what looks like an ordinary UDP socket */
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
// set up addresses
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
// [-] addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = inet_addr(my_ipv4Addr);
addr.sin_port = htons(port);
// bind socket
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
// use setsockopt() to request that the kernel join a multicast group
mreq.imr_multiaddr.s_addr = inet_addr(group);
// [-] mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_interface.s_addr = inet_addr(my_ipv4Addr);
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))< 0) {
perror("setsockopt");
exit(1);
}
Edit:
Позвольте мне объяснить цель моей программы. Я пишу небольшой инструмент, который проверяет, поддерживает ли сеть широковещательную/многоадресную рассылку. Поэтому я владею системой с двумя интерфейсами и передаю через интерфейс1 пакет многоадресной рассылки и пытаюсь получить его с помощью интерфейса2. Но: пакет должен проходить через сеть, а не устройство loopack.
Идея состоит в том, чтобы блокировать многоадресную петлю на thread1/interface1 с помощью:
u_char loop = 0;
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
И прослушивать интерфейс thread2/interface 2 для интерфейса. Tcpdump показывает, что пакеты поступают, но сбрасываются с моей конфигурацией выше.