📄 alc_socket.c
字号:
/* Join the multicast group */ if(ch->s->addr_family == PF_INET) { #ifdef SSM if(ch->s->ssm) { ch->source_imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr; if(ch->intface == NULL) { ch->source_imr.imr_interface.s_addr = htonl(INADDR_ANY); } else { ch->source_imr.imr_interface.s_addr = inet_addr(ch->intface); } ch->source_imr.imr_sourceaddr.s_addr = inet_addr(ch->s->src_addr); if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *)&ch->source_imr, sizeof(ch->source_imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_ADD_SOURCE_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_ADD_SOURCE_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; } } else { ch->imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr; if(ch->intface == NULL) { ch->imr.imr_interface.s_addr = htonl(INADDR_ANY); } else { ch->imr.imr_interface.s_addr = inet_addr(ch->intface); } if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ch->imr, sizeof(ch->imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; } }#else ch->imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr; if(ch->intface == NULL) { ch->imr.imr_interface.s_addr = htonl(INADDR_ANY); } else { ch->imr.imr_interface.s_addr = inet_addr(ch->intface); } if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ch->imr, sizeof(ch->imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; }#endif } else if(ch->s->addr_family == PF_INET6) { #if defined(LINUX) && defined(SSM) if(ch->s->ssm) { if(ch->intface_name == NULL) { ch->greqs.gsr_interface = 0; } else { ch->greqs.gsr_interface = if_nametoindex(ch->intface_name); } memcpy(&ch->greqs.gsr_group, &ch->remote6, sizeof(ch->remote6)); source.sin6_family = AF_INET6; inet_pton(AF_INET6, ch->s->src_addr, &source.sin6_addr); memcpy(&ch->greqs.gsr_source, &source, sizeof(source)); if(setsockopt(ch->rx_sock, IPPROTO_IPV6, MCAST_JOIN_SOURCE_GROUP, (char *)&ch->greqs, sizeof(ch->greqs)) < 0) { printf("setsockopt (MCAST_JOIN_SOURCE_GROUP) failed: %d\n", errno); fflush(stdout); close(ch->rx_sock); return -1; } } else { ch->imr6.ipv6mr_multiaddr = ch->remote6.sin6_addr; if(ch->intface_name == NULL) { ch->imr6.ipv6mr_interface = 0; } else { ch->imr6.ipv6mr_interface = if_nametoindex(ch->intface_name); } if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&ch->imr6, sizeof(ch->imr6)) < 0) { printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", errno); fflush(stdout); close(ch->rx_sock); return -1; } }#else ch->imr6.ipv6mr_multiaddr = ch->remote6.sin6_addr;#ifdef LINUX if(ch->intface_name == NULL) { ch->imr6.ipv6mr_interface = 0; } else { ch->imr6.ipv6mr_interface = if_nametoindex(ch->intface_name); }#else if(ch->intface_name == NULL) { ch->imr6.ipv6mr_interface = 0; } else { ch->imr6.ipv6mr_interface = atoi(ch->intface_name); } #endif if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&ch->imr6, sizeof(ch->imr6)) < 0) {#ifdef WIN32 printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; }#endif } } } return 0;}/* * This function closes tx or rx socket * * Params: alc_channel_t *ch: Pointer to channel * * Return: int: 0 in success, -1 otherwise * */int close_alc_socket(alc_channel_t *ch) { int mode; int addr_type; mode = ch->s->mode; addr_type = ch->s->addr_type; if(mode == SENDER) { #ifdef WIN32 closesocket(ch->tx_sock);#else close(ch->tx_sock);#endif } if(mode == RECEIVER) { if(addr_type == 0) { if(ch->s->addr_family == PF_INET) { #ifdef SSM if(ch->s->ssm) { if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, (char *)&ch->source_imr, sizeof(ch->source_imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_DROP_SOURCE_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_DROP_SOURCE_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; } } else { if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ch->imr, sizeof(ch->imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; } }#else if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ch->imr, sizeof(ch->imr)) < 0) { #ifdef WIN32 printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; }#endif } else if(ch->s->addr_family == PF_INET6) { #if defined(LINUX) && defined(SSM) if(ch->s->ssm) { if(setsockopt(ch->rx_sock, IPPROTO_IPV6, MCAST_LEAVE_SOURCE_GROUP, (char *)&ch->greqs, sizeof(ch->greqs)) < 0) { printf("setsockopt (MCAST_LEAVE_SOURCE_GROUP) failed: %d\n", errno); fflush(stdout); close(ch->rx_sock); return -1; } } else { if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, (char *)&ch->imr6, sizeof(ch->imr6)) < 0) { printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", errno); fflush(stdout); close(ch->rx_sock); return -1; } }#else if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, (char *)&ch->imr6, sizeof(ch->imr6)) < 0) { #ifdef WIN32 printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", WSAGetLastError()); fflush(stdout);#else printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", errno); fflush(stdout);#endif close(ch->rx_sock); return -1; }#endif } } #ifdef WIN32 closesocket(ch->rx_sock);#else close(ch->rx_sock);#endif } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -