⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcast_join.lc

📁 unix网络编程卷1:套接口API的全书源码
💻 LC
📖 第 1 页 / 共 2 页
字号:
/* 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 + -