📄 mcast_join.lc
字号:
/* include mcast_join1 */#include "unp.h"## 1 ##src/lib/mcast_join.c###include <net/if.h>## 2 ##src/lib/mcast_join.c##int## 3 ##src/lib/mcast_join.c##mcast_join(int sockfd, const SA *grp, socklen_t grplen,## 4 ##src/lib/mcast_join.c## const char *ifname, u_int ifindex)## 5 ##src/lib/mcast_join.c##{## 6 ##src/lib/mcast_join.c###ifdef MCAST_JOIN_GROUP## 7 ##src/lib/mcast_join.c## struct group_req req;## 8 ##src/lib/mcast_join.c## if (ifindex > 0) {## 9 ##src/lib/mcast_join.c## req.gr_interface = ifindex;## 10 ##src/lib/mcast_join.c## } else if (ifname != NULL) {## 11 ##src/lib/mcast_join.c## if ((req.gr_interface = if_nametoindex(ifname)) == 0) {## 12 ##src/lib/mcast_join.c## errno = ENXIO; /* i/f name not found */## 13 ##src/lib/mcast_join.c## return (-1);## 14 ##src/lib/mcast_join.c## }## 15 ##src/lib/mcast_join.c## } else## 16 ##src/lib/mcast_join.c## req.gr_interface = 0;## 17 ##src/lib/mcast_join.c## memcpy(&req.gr_group, grp, grplen);## 18 ##src/lib/mcast_join.c## return (setsockopt(sockfd, family_to_level(grp->sa_family),## 19 ##src/lib/mcast_join.c## MCAST_JOIN_GROUP, &req, sizeof(req)));## 20 ##src/lib/mcast_join.c##/* end mcast_join1 */#else## 21 ##src/lib/mcast_join.c##/* include mcast_join2 */ switch (grp->sa_family) {## 22 ##src/lib/mcast_join.c## case AF_INET:{## 23 ##src/lib/mcast_join.c## struct ip_mreq mreq;## 24 ##src/lib/mcast_join.c## struct ifreq ifreq;## 25 ##src/lib/mcast_join.c## memcpy(&mreq.imr_multiaddr,## 26 ##src/lib/mcast_join.c## &((const struct sockaddr_in *) grp)->sin_addr,## 27 ##src/lib/mcast_join.c## sizeof(struct in_addr));## 28 ##src/lib/mcast_join.c## if (ifindex > 0) {## 29 ##src/lib/mcast_join.c## if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {## 30 ##src/lib/mcast_join.c## errno = ENXIO; /* i/f index not found */## 31 ##src/lib/mcast_join.c## return (-1);## 32 ##src/lib/mcast_join.c## }## 33 ##src/lib/mcast_join.c## goto doioctl;## 34 ##src/lib/mcast_join.c## } else if (ifname != NULL) {## 35 ##src/lib/mcast_join.c## strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);## 36 ##src/lib/mcast_join.c## doioctl:## 37 ##src/lib/mcast_join.c## if (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)## 38 ##src/lib/mcast_join.c## return (-1);## 39 ##src/lib/mcast_join.c## memcpy(&mreq.imr_interface,## 40 ##src/lib/mcast_join.c## &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,## 41 ##src/lib/mcast_join.c## sizeof(struct in_addr));## 42 ##src/lib/mcast_join.c## } else## 43 ##src/lib/mcast_join.c## mreq.imr_interface.s_addr = htonl(INADDR_ANY);## 44 ##src/lib/mcast_join.c## return (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,## 45 ##src/lib/mcast_join.c## &mreq, sizeof(mreq)));## 46 ##src/lib/mcast_join.c## }## 47 ##src/lib/mcast_join.c##/* end mcast_join2 *//* include mcast_join3 */#ifdef IPV6## 48 ##src/lib/mcast_join.c###ifndef IPV6_JOIN_GROUP /* APIv0 compatibility */## 49 ##src/lib/mcast_join.c###define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP## 50 ##src/lib/mcast_join.c###endif## 51 ##src/lib/mcast_join.c## case AF_INET6:{## 52 ##src/lib/mcast_join.c## struct ipv6_mreq mreq6;## 53 ##src/lib/mcast_join.c## memcpy(&mreq6.ipv6mr_multiaddr,## 54 ##src/lib/mcast_join.c## &((const struct sockaddr_in6 *) grp)->sin6_addr,## 55 ##src/lib/mcast_join.c## sizeof(struct in6_addr));## 56 ##src/lib/mcast_join.c## if (ifindex > 0) {## 57 ##src/lib/mcast_join.c## mreq6.ipv6mr_interface = ifindex;## 58 ##src/lib/mcast_join.c## } else if (ifname != NULL) {## 59 ##src/lib/mcast_join.c## if ((mreq6.ipv6mr_interface = if_nametoindex(ifname)) == 0) {## 60 ##src/lib/mcast_join.c## errno = ENXIO; /* i/f name not found */## 61 ##src/lib/mcast_join.c## return (-1);## 62 ##src/lib/mcast_join.c## }## 63 ##src/lib/mcast_join.c## } else## 64 ##src/lib/mcast_join.c## mreq6.ipv6mr_interface = 0;## 65 ##src/lib/mcast_join.c## return (setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP,## 66 ##src/lib/mcast_join.c## &mreq6, sizeof(mreq6)));## 67 ##src/lib/mcast_join.c## }## 68 ##src/lib/mcast_join.c###endif## 69 ##src/lib/mcast_join.c## default:## 70 ##src/lib/mcast_join.c## errno = EPROTONOSUPPORT;## 71 ##src/lib/mcast_join.c## return (-1);## 72 ##src/lib/mcast_join.c## }## 73 ##src/lib/mcast_join.c###endif## 74 ##src/lib/mcast_join.c##}## 75 ##src/lib/mcast_join.c##/* end mcast_join3 */void## 76 ##src/lib/mcast_join.c##Mcast_join(int sockfd, const SA *grp, socklen_t grplen,## 77 ##src/lib/mcast_join.c## const char *ifname, u_int ifindex)## 78 ##src/lib/mcast_join.c##{## 79 ##src/lib/mcast_join.c## if (mcast_join(sockfd, grp, grplen, ifname, ifindex) < 0)## 80 ##src/lib/mcast_join.c## err_sys("mcast_join error");## 81 ##src/lib/mcast_join.c##}## 82 ##src/lib/mcast_join.c##int## 83 ##src/lib/mcast_join.c##mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,## 84 ##src/lib/mcast_join.c## const SA *grp, socklen_t grplen,## 85 ##src/lib/mcast_join.c## const char *ifname, u_int ifindex)## 86 ##src/lib/mcast_join.c##{## 87 ##src/lib/mcast_join.c###ifdef MCAST_JOIN_SOURCE_GROUP## 88 ##src/lib/mcast_join.c## struct group_source_req req;## 89 ##src/lib/mcast_join.c## if (ifindex > 0) {## 90 ##src/lib/mcast_join.c## req.gr_interface = ifindex;## 91 ##src/lib/mcast_join.c## } else if (ifname != NULL) {## 92 ##src/lib/mcast_join.c## if ((req.gr_interface = if_nametoindex(ifname)) == 0) {## 93 ##src/lib/mcast_join.c## errno = ENXIO; /* i/f name not found */## 94 ##src/lib/mcast_join.c## return (-1);## 95 ##src/lib/mcast_join.c## }## 96 ##src/lib/mcast_join.c## } else## 97 ##src/lib/mcast_join.c## req.gr_interface = 0;## 98 ##src/lib/mcast_join.c## memcpy(&req.gr_group, grp, grplen);## 99 ##src/lib/mcast_join.c## memcpy(&req.gr_src, src, srclen);##100 ##src/lib/mcast_join.c## return (setsockopt(sockfd, family_to_level(grp->sa_family),##101 ##src/lib/mcast_join.c## MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)));##102 ##src/lib/mcast_join.c###else##103 ##src/lib/mcast_join.c## switch (grp->sa_family) {##104 ##src/lib/mcast_join.c###ifdef IP_ADD_SOURCE_MEMBERSHIP##105 ##src/lib/mcast_join.c## case AF_INET:{##106 ##src/lib/mcast_join.c## struct ip_mreq_source mreq;##107 ##src/lib/mcast_join.c## struct ifreq ifreq;##108 ##src/lib/mcast_join.c## memcpy(&mreq.imr_multiaddr,##109 ##src/lib/mcast_join.c## &((struct sockaddr_in *) grp)->sin_addr,##110 ##src/lib/mcast_join.c## sizeof(struct in_addr));##111 ##src/lib/mcast_join.c## memcpy(&mreq.imr_sourceaddr,##112 ##src/lib/mcast_join.c## &((struct sockaddr_in *) src)->sin_addr,##113 ##src/lib/mcast_join.c## sizeof(struct in_addr));##114 ##src/lib/mcast_join.c## if (ifindex > 0) {##115 ##src/lib/mcast_join.c## if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {##116 ##src/lib/mcast_join.c##
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -