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));

这段代码主要涉及在套接字级别设置选项以加入IP多播组。在`sockaddr.c`中,循环遍历接收地址并使用`pgm_setsockopt`加入多播组,同时根据条件设置UDP封装的多播端口。在处理`PGM_JOIN_GROUP`情况时,将组请求信息存储到套接字结构中,并调用`pgm_sockaddr_join_group`函数进行实际的多播组加入操作,该函数通过`setsockopt`设置相应的多播选项。
1353

被折叠的 条评论
为什么被折叠?



