sockaddr.c
/* join IP multicast groups */
for (unsigned i = 0; i < res->ai_recv_addrs_len; i++)
pgm_setsockopt (sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct pgm_group_source_req));
pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct pgm_group_source_req));
pgm_freeaddrinfo (res);
socket.c
case PGM_JOIN_GROUP:
.............................................
sock->recv_gsr[sock->recv_gsr_len].gsr_interface = gr->gr_interface;
memcpy (&sock->recv_gsr[sock->recv_gsr_len].gsr_group, &gr->gr_group, pgm_sockaddr_len ((const struct sockaddr*)&gr->gr_group));
if (sock->udp_encap_mcast_port)
((struct sockaddr_in*)&sock->recv_gsr[sock->recv_gsr_len].gsr_group)->sin_port = htons (sock->udp_encap_mcast_port);
memcpy (&sock->recv_gsr[sock->recv_gsr_len].gsr_source, &gr->gr_group, pgm_sockaddr_len ((const struct sockaddr*)&gr->gr_group));
/* Resolved address family gr->gr_group.ss_family can be different from sock->family = AF_UNSPEC */
if (SOCKET_ERROR == pgm_sockaddr_join_group (sock->recv_sock, gr->gr_group.ss_family, gr)) {
socket.c
PGM_GNUC_INTERNAL
int
pgm_sockaddr_join_group (
const SOCKET s,
const sa_family_t sa_family,
const struct group_req* gr
)
............................................................
//const int recv_level = (AF_INET == sa_family) ? SOL_IP : SOL_IPV6;
const int recv_level = (AF_INET == sa_family) ? IPPROTO_IP : IPPROTO_IPV6;
retval = setsockopt (s, recv_level, MCAST_JOIN_GROUP, (const char*)gr, sizeof(struct group_req));