免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1251 | 回复: 0

添加组播接收 [复制链接]

论坛徽章:
0
发表于 2010-02-05 09:45 |显示全部楼层

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include  /* the L2 protocols */
#define BUFFER_MAX 2048
int   multicast_eth(int fd)   
{   
    struct   sockaddr_ll sll;     
    struct   ifreq   ifstruct;  
    struct packet_mreq    mr;  
    int ret;  
   
    memset(  &sll,   0,   sizeof(sll)   );   
    sll.sll_family =   PF_PACKET;   
    sll.sll_protocol =   htons(ETH_P_ALL);  
   
         
    strcpy(ifstruct.ifr_name,   "eth0");   
    ret = ioctl(fd,   SIOCGIFINDEX,   &ifstruct);   
    if(ret != 0 )
    {
            printf("line:% d\n", __LINE__);
    }  
     
    sll.sll_ifindex   =   ifstruct.ifr_ifindex;
    mr.mr_ifindex     =   ifstruct.ifr_ifindex;
   
     ret = ioctl (fd, SIOCGIFHWADDR, &ifstruct);  
     if(ret != 0 )
    {
            printf("line:% d\n", __LINE__);
    }   
     memcpy (sll.sll_addr, ifstruct.ifr_ifru.ifru_hwaddr.sa_data, sizeof(sll.sll_addr));
   
   
     if( bind(fd,  (struct  sockaddr *)&sll, sizeof(sll)) ==  -1  )   
    {   
             printf(  "bind:   ERROR\n"   );   
       return   -1;   
    }
   
   
    ret = ioctl (fd, SIOCGIFFLAGS, &ifstruct);
    if(ret != 0 )
    {
            printf("error: %s \n",strerror(errno));
            printf("ret= %d,line: %d\n", ret,__LINE__);
    }   
        
    ifstruct.ifr_flags |= (IFF_UP | IFF_BROADCAST | IFF_MULTICAST);
    ifstruct.ifr_flags &= ~IFF_ALLMULTI;
    //
     ret = ioctl (fd, SIOCSIFFLAGS, &ifstruct);
     if(ret != 0 )
    {
            printf("error: %s \n",strerror(errno));
            printf("ret= %d,line: %d\n", ret,__LINE__);
    }
   char mymac[6]={0x01,0x80,0xC2,0x00,0x00,0x00};
      
/*
    memcpy(ifstruct.ifr_hwaddr.sa_data, mymac, 6);
    ifstruct.ifr_hwaddr.sa_data[0] = 0x01;
    ifstruct.ifr_hwaddr.sa_data[1] = 0x80;
    ifstruct.ifr_hwaddr.sa_data[2] = 0xC2;
    ifstruct.ifr_hwaddr.sa_data[3] = 0x00;
    ifstruct.ifr_hwaddr.sa_data[4] = 0;
    ifstruct.ifr_hwaddr.sa_data[5] = 0;
   
    ret = ioctl (fd, SIOCADDMULTI, ifstruct);
    if(ret != 0 )
    {
            printf("error: %s \n",strerror(errno));
            printf("ret= %d,line: %d\n", ret,__LINE__);
    }
*/
    strcpy(ifstruct.ifr_name,   "eth0");   
    ret = ioctl(fd,   SIOCGIFINDEX,   &ifstruct);   
    if(ret != 0 )
    {
            printf("line:% d\n", __LINE__);
    }  
    memset(&mr, 0, sizeof(mr));
    mr.mr_ifindex = ifstruct.ifr_ifindex;
    mr.mr_type = PACKET_MR_MULTICAST;
    mr.mr_alen = 6;  
    memcpy(mr.mr_address, mymac, 6);
   
    ret = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,&mr, sizeof(mr));
    if(ret != 0 )
    {
            printf("error: %s \n",strerror(errno));
            printf("ret= %d,line: %d\n", ret,__LINE__);
    }
    return   0;   
}  
int main(int argc, char *argv[])
{
      
    int sock, n_read, proto;      
    char buffer[BUFFER_MAX];
    char  *ethhead, *iphead, *tcphead, *udphead, *icmphead, *p;
                 
   
    if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) "
               "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
        p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n,
        p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n);
       iphead = ethhead + 14;  
       p = iphead + 12;
        
       printf("IP: %d.%d.%d.%d => %d.%d.%d.%d\n",
       p[0]&0XFF, p[1]&0XFF, p[2]&0XFF, p[3]&0XFF,
       p[4]&0XFF, p[5]&0XFF, p[6]&0XFF, p[7]&0XFF);
       proto = (iphead + 9)[0];
       p = iphead + 20;
       printf("Protocol: ");
       switch(proto)
         {
           case IPPROTO_ICMP: printf("ICMP\n");break;
           case IPPROTO_IGMP: printf("IGMP\n");break;
           case IPPROTO_IPIP: printf("IPIP\n");break;
           case IPPROTO_TCP :
           case IPPROTO_UDP :
           printf("%s,", proto == IPPROTO_TCP ? "TCP": "UDP");
           printf("source port: %u,",(p[0]<<8)&0XFF00 |  p[1]&0XFF);
           printf("dest port: %u\n", (p[2]<<8)&0XFF00 | p[3]&0XFF);
                break;
           case IPPROTO_RAW : printf("RAW\n");break;
           default:printf("Unkown, please query in include/linux/in.h\n");
        }
   }
}
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39383/showart_2178237.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2022中国系统架构师大会

2022年1月13日~15日,由IT168旗下ITPUB企业社区平台主办的第十四届中国系统架构师大会(SACC2022)将在云端进行网络直播。承续上届“数字转型 架构重塑”核心主题,按照技术主线分为架构线(传统架构-分布式架构-微服务架构-低代码架构)、运维篇(DevOps、AIOps、高效运维、数据安全等)、金融行业篇、前沿技术篇、大数据篇等,云集国内CTO、研发总监、高级系统架构师、开发工程师和IT经理等技术人群,力争为各路豪杰奉献一场技术的饕餮盛宴。

大会官网
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP