#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))) < 0)
{
fprintf(stdout, "create socket error\n");
return -1;
}
multicast_eth(sock);
while(1)
{
n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
/*
14 6(dest)+6(source)+2(type or length)
+
20 ip header
+
8 icmp,tcp or udp header
= 42
*/
if(n_read < 42)
{
fprintf(stdout, "Incomplete header, packet corrupt\n");
continue;
}
ethhead = buffer;
p = ethhead;
int n = 0xFF;
printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>"
"%.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");
}
}
}
阅读(1230) | 评论(0) | 转发(0) |