2950|0

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

icmpv6 NS 检测地址冲突出错怎么办? [复制链接]

int icmpv6_NS(char *pIfname, struct in6_addr *dst)
{
    int sockfd      = -1;
   
    int sockopt = 0;
    int rc = 0;   
    char buff[512] = {0};
    int len = 0;
    struct sockaddr_in6 multi_addr;
    struct ipv6_mreq mreq6;
   
    struct nd_neighbor_solicit *ns_pkt;

    fd_set rset;
    struct timeval timeout;
   
    if((NULL == pIfname) || (NULL == dst))
    {
        return -1;
    }
    sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
    if(sockfd <= 0)
    {
        printf("NS icmpv6 socket create error!\r\n");
        return -1;
    }
   
    sockopt = offsetof(struct icmp6_hdr, icmp6_cksum);
    if(2 != sockopt)
    {
        perror("icmp_cksum offset error\r\n");
        close(sockfd);
        return -1;
    }
    if(setsockopt(sockfd, SOL_RAW, IPV6_CHECKSUM, &sockopt, sizeof(sockopt)) < 0)
    {
        perror("icmp_cksum set error\r\n");
        close(sockfd);
        return -1;
    }
    /*ns packet*/
    ns_pkt = (struct nd_neighbor_solicit*)buff;

    ns_pkt->nd_ns_type      = ND_NEIGHBOR_SOLICIT;
    ns_pkt->nd_ns_code      = 0;
    ns_pkt->nd_ns_reserved  = 0;

    memcpy(&ns_pkt->nd_ns_target, dst, sizeof(struct in6_addr));
    multi_addr.sin6_family = AF_INET6;

    //get node multi_addr
    inet_pton(AF_INET6, "FF02::1:FF00:0", &multi_addr.sin6_addr);
    multi_addr.sin6_addr.s6_addr[13] = dst->s6_addr[13];
    multi_addr.sin6_addr.s6_addr[14] = dst->s6_addr[14];  
    multi_addr.sin6_addr.s6_addr[15] = dst->s6_addr[15];

    //join group
    memcpy(&mreq6.ipv6mr_multiaddr, &multi_addr.sin6_addr,sizeof(struct in6_addr));
    mreq6.ipv6mr_interface = if_nametoindex(pIfname);
    setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof(mreq6));

    //set multicast hops to 255
    sockopt = 255;
    setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &sockopt, sizeof(int));

    //send data
    len = sendto(sockfd, buff, sizeof(struct nd_neighbor_solicit), 0, (struct sockaddr*)&multi_addr, sizeof(struct sockaddr_in6));
   
    printf("len is %d\r\n", len);
    perror("len is \r\n");
    //recv
    timeout.tv_sec    = 2;
    timeout.tv_usec    = 0;
   
    FD_ZERO(&rset);
    FD_SET(sockfd, &rset);   
    rc = select(sockfd+1,&rset,NULL,NULL,&timeout);

    len = recv(sockfd, buff, sizeof(buff), 0);
    printf("len is %d\r\n", len);


    /*
    while(1)
    {
        FD_ZERO(&fdset);
        FD_SET(sockfd_rec, &fdset);
        
        rc = select(sockfd_rec + 1, &fdset, NULL, NULL, &tm);
        
        if(rc == 0)
        {
            printf("----------time out\r\n");
            break;
        }
        else if(rc > 0)
        {
            //recvfrom(sockfd, );
            len = recv(sockfd_rec, buff, sizeof(buff), 0);
            break;
        }
        
    }
    */
    //leave the group
    setsockopt(sockfd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq6, sizeof(mreq6));
   
    close(sockfd);
    return 0;
}
这段代码是检测地址冲突的,
当使用select时,sendto发送失败,为什么?
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表