IP_ADD_MEMBERSHIP auf einem sockel, der sockel hört unicast auch?
Erwägen Sie den code unten
Ich bin versucht zu binden eine UDP-socket-multicast.
Ich habe gebunden an einen bestimmten port, und legen Sie IP_ADD_MEMBERSHIP
für die Adresse, zu hören.
Meine Frage: wird der socket receive-unicast-UDP-Pakete für diesen port gebunden? Wenn ja, wie kann ich es verhindern? Ich möchte nur empfangen von multicast.
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);
}
- Vielleicht möchten Sie Blick auf das eingehende Paket die Ziel-IP-Adresse (wie beschrieben unter stackoverflow.com/questions/5281409/... ) und ignorieren das Paket, falls die IP-Adresse nicht eine multicast-IP-Adresse? (OTOH, möchten Sie vielleicht zu prüfen, warum Sie nicht mehr erhalten möchten, unicast-Pakete-vermutlich sind Sie gesendet werden, um Sie für einen guten Grund)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie müssen auch
bind
auf der bestimmten multicast-Adresse auf, die Sie hören möchten, und nicht nur in dersetsockopt
nennen - letzterer auch notwendig, um sicherzustellen, dass die Netzwerk-Karte und IGMP-auch das richtige tun.Siehe auch Was bedeutet es, binden Sie einen multicast-socket (UDP)?
bind()
nennen, obwohlINADDR_ANY
ist wohl falsch in diesem Kontext...