IP_ADD_MEMBERSHIP для сокета, будет ли сокет также прослушивать одноадресную передачу?

Учитывая код ниже,

Я пытаюсь привязать сокет UDP для многоадресной рассылки.
Я привязал его к определенному порту и установил IP_ADD_MEMBERSHIP для адреса, чтобы слушать.

Мой вопрос: будет ли сокет получать одноадресные UDP-пакеты, привязанные к этому порту? Если так, как я могу предотвратить это? Я хочу получать только многоадресную рассылку.

int fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}

u_int yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
{
perror("Reusing ADDR failed");
exit(1);
}

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = (source_iface.empty()
? htonl(INADDR_ANY)
: inet_addr(source_iface.c_str()));

if (bind(fd,(struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(1);
}

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = (source_iface.empty()
? htonl(INADDR_ANY)
: inet_addr(source_iface.c_str()));

if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
{
perror("setsockopt");
exit(1);
}

2

Решение

Я полагаю, вам также нужно bind на конкретном многоадресном адресе, который вы хотите прослушать, а не только в setsockopt вызов — последний также необходим, чтобы убедиться, что сетевая карта и IGMP также делают правильные вещи.

Смотрите также Что значит связать многоадресный (UDP) сокет?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]