Correct way to join a Multicast Group on a specified interface.
Generally Multicast Sockets should be bound to the wildcard address [INADDR_ANY], before joining the group. Once the binding is done, you can join to the desired group
by calling SetSockOpt API with IP_ADD_MEMBERSHIP providing the IP address of the desired interface and the ip address of the multicast group to join. Below code shows
you how to do that:
1: SOCKET s;
2:
3: SOCKADDR_IN localif;
4:
5: struct ip_mreq mreq;
6:
7: s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
8:
9: localif.sin_family = AF_INET;
10:
11: localif.sin_port = htons(29309);
12:
13: localif.sin_addr.s_addr = htonl(INADDR_ANY);
14:
15: //First Bind to WildCard Address.
16:
17: int ret = bind(s, (SOCKADDR *)&localif, sizeof(localif));
18:
19: if(ret!=0)
20:
21: {
22:
23: printf("Bind %d\n",WSAGetLastError());
24:
25: return 0;
26:
27: }
28:
29: //Add to the desired multicast group on the desired interface by calling SetSockOpt.
30:
31: mreq.imr_interface.s_addr = inet_addr("172.17.2.153");
32:
33: mreq.imr_multiaddr.s_addr = inet_addr("224.1.99.99");
34:
35: setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
-Balajee P
Windows SDK