zoukankan      html  css  js  c++  java
  • mcast_set_if函数

    #include    <errno.h>
    #include    <string.h>
    #include    <net/if.h>
    #include    <sys/ioctl.h>
    #include    <sys/socket.h>
    #include    <netinet/in.h>
    
    int sockfd_to_family(int);
    
    int mcast_set_if(int sockfd, const char *ifname, u_int ifindex)
    {
        switch (sockfd_to_family(sockfd)) {
            case AF_INET: {
                struct in_addr    inaddr;
                struct ifreq    ifreq;
    
                if (ifindex > 0) {
                    if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {
                        errno = ENXIO;    /* i/f index not found */
                        return(-1);
                    }
                    goto doioctl;
                } else if (ifname != NULL) {
                    strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
                    doioctl:
                    if (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0) {
                        return(-1);
                    }
                    memcpy(&inaddr,
                       &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,
                       sizeof(struct in_addr));
                } else {
                    /* remove prev. set default */
                    inaddr.s_addr = htonl(INADDR_ANY);    
                }
    
                return(setsockopt(sockfd, IPPROTO_IP, 
                       IP_MULTICAST_IF, &inaddr, sizeof(struct in_addr)));
            }
    
    #ifdef    IPV6
            case AF_INET6: {
                u_int    idx;
    
                if ( (idx = ifindex) == 0) {
                    if (ifname == NULL) {
                        errno = EINVAL;    /* must supply either index or name */
                        return(-1);
                    }
                    if ( (idx = if_nametoindex(ifname)) == 0) {
                        errno = ENXIO;    /* i/f name not found */
                        return(-1);
                    }
                }
                return(setsockopt(sockfd, IPPROTO_IPV6, 
                       IPV6_MULTICAST_IF, &idx, sizeof(idx)));
            }
    #endif
            default: {
                errno = EAFNOSUPPORT;
                return(-1);
            }
        }
    }
  • 相关阅读:
    关于工作中Git相关的总结
    浅谈MySQL的优化
    由内搜推送思考Kafka 的原理
    SOA和微服务架构
    Centos7.2 搭建Lamp服务器以及迁移WordPress个人博客详细过程
    MyISAM和InnoDB索引实现区别
    图解高内聚与低耦合
    图解Java常用数据结构(一)
    Java源码安全审查
    Java高并发之锁优化
  • 原文地址:https://www.cnblogs.com/soldierback/p/10804838.html
Copyright © 2011-2022 走看看