#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ether.h>
#include <arpa/inet.h>
#include <string.h>
#include <netpacket/packet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <pthread.h>
#include "get_interface.h"
#include <stdlib.h>
typedef struct st_my_arp
{
char ip_str[4];
char mac_str[6];
} ST_MY_ARP;
typedef struct st_my_ethname_and_arp
{
char ethname[10];
ST_MY_ARP my_eth_st[256];
} ST_MY_ETHNAME_AND_ARP;
ST_MY_ARP my_arp[256];
ST_MY_ETHNAME_AND_ARP my_ethname_arp[10];
unsigned char *my_find_from_arp(unsigned char *p, unsigned char *p_ethname)
{
printf("---------------------------------------进入从arp表里找目的mac\n");
unsigned char *my_arp_dst_mac = (unsigned char *)malloc(6);
int j = 0;
for (j = 0; j < get_interface_num(); j++)
{
printf("2222222222222222222222222进入从arp表里找目的mac\n");
if (memcmp(my_ethname_arp[j].ethname, p_ethname, 10) == 0)
{
printf("网卡比较成功\n");
printf("现在是第%d个my_ethname_arp\n", j);
break;
}
}
int i = 0;
for (i = 0; i < 256; i++)
{
printf("3333333333333333333333333333进入从arp表里找目的mac\n");
printf("现在验证my_ethname_arp[j].my_eth_st[i].ip_str------\n");
int uu=0;
for (uu = 0; uu < 4; uu++)
{
printf("-----------i=%d\n",i);
printf("%02x:", *(unsigned char*)(my_ethname_arp[j].my_eth_st[i].ip_str + uu));
}
printf("\n");
if (memcmp(my_ethname_arp[j].my_eth_st[i].ip_str, p, 4) == 0)
{
printf("ip匹配成功\n");
memcpy(my_arp_dst_mac, my_ethname_arp[j].my_eth_st[i].mac_str, 6);
int tt=0;
for (tt = 0; tt < 6; tt++)
{
printf("%02x:", *( my_ethname_arp[j].my_eth_st[i].mac_str + tt));
}
return my_arp_dst_mac;
}
}
printf("4444444444444444444444444进入从arp表里找目的mac\n");
my_arp_dst_mac = NULL;
return my_arp_dst_mac;
}
void *deal_fun(void *arg)
{
int sockfd = (int)arg;
printf("sockfd=%d\n", sockfd);
getinterface();
int mm=0;
for ( mm = 0; mm < get_interface_num() ; mm++)
{
memcpy(my_ethname_arp[mm].ethname,net_interface[mm].name,10);
}
while (1)
{
unsigned char buf[1500] = "";
int len = recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
printf("len = %d\n", len);
unsigned short mac_type = ntohs(*(unsigned short *)(buf + 12));
if (mac_type == 0x0806)
{
if (buf[21] == 2)
{
int ii = 0;
for (ii = 0; ii < get_interface_num(); ii++)
{
if (memcmp(buf + 28, net_interface[ii].ip, 3) == 0)
break;
}
char ip_str[16] = "";
char mac_str[18] = "";
inet_ntop(AF_INET, buf + 28, ip_str, 16);
unsigned char xxx = *(unsigned char *)(buf + 28 + 3);
sprintf(mac_str, "%02x:%02x:%02x:%02x:%02x:%02x",
buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
printf("获得arp应答的源ip与源mac%s----%s\n", ip_str, mac_str);
memcpy(my_ethname_arp[ii].my_eth_st[xxx].ip_str, buf + 28, 4);
memcpy(my_ethname_arp[ii].my_eth_st[xxx].mac_str, buf + 22, 6);
int oo = 0;
printf("现在验证写入的mac------");
for (oo = 0; oo < 6; oo++)
{
printf("%02x:", *(unsigned char*)( my_ethname_arp[ii].my_eth_st[xxx].mac_str+ oo));
}
printf("\n");
printf("现在验证写入的ip------");
for (oo = 0; oo < 4; oo++)
{
printf("%02x:", *(unsigned char*)( my_ethname_arp[ii].my_eth_st[xxx].ip_str+ oo));
}
printf("\n");
}
}
else if (mac_type == 0x0800)
{
printf("-----收到一只Ip报文\n");
unsigned char *dst_ip = buf + 14 + 16;
int i = 0;
for (i = 0; i < get_interface_num(); i++)
{
if (memcmp(dst_ip, net_interface[i].ip, 3) == 0 && memcmp(dst_ip, net_interface[i].ip, 4) != 0)
{
printf("dddddddddddddddddddddddd\n");
memcpy(buf + 6, net_interface[i].mac, 6);
unsigned char *dst_mac = my_find_from_arp(dst_ip, net_interface[i].name);
printf("\n");
if (dst_mac == NULL)
{
unsigned char a[6] = "";
int jj = 0;
for (jj = 0; jj < 6; jj++)
{
sscanf(((unsigned char *)net_interface[i].mac) + jj, "%c", a + jj);
}
unsigned char b[4] = "";
for (jj = 0; jj < 4; jj++)
{
sscanf((unsigned char *)net_interface[i].ip + jj, "%c", b + jj);
}
unsigned char c[4] = "";
for (jj = 0; jj < 4; jj++)
{
sscanf((unsigned char *)dst_ip + jj, "%c", c + jj);
}
unsigned char msg[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
a[0], a[1], a[2], a[3], a[4], a[5],
0x08, 0x06,
0x00, 0x01,
0x08, 0x00,
6,
4,
0x00, 0x01,
0x00, 0x0c, 0x29, 0xb3, 0x34, 0x0b,
b[0], b[1], b[2], b[3],
0, 0, 0, 0, 0, 0,
c[0], c[1], c[2], c[3]
};
struct ifreq ethreq;
strncpy(ethreq.ifr_name, net_interface[i].name, IFNAMSIZ);
ioctl(sockfd, SIOGIFINDEX, ðreq);
struct sockaddr_ll sll;
bzero(&sll, sizeof(sll));
sll.sll_ifindex = ethreq.ifr_ifindex;
sendto(sockfd, msg, 42, 0, (struct sockaddr *)&sll, sizeof(sll));
break;
}
else if (dst_mac != NULL)
{
printf("dddddddddddddddddddddddddddddddd\n");
memcpy(buf, dst_mac, 6);
printf("mac地址为");
int j = 0;
for (j = 0; j < 6; j++)
{
printf("%02x:", *(buf + j));
}
}
struct ifreq ethreq;
strncpy(ethreq.ifr_name, net_interface[i].name, IFNAMSIZ);
ioctl(sockfd, SIOGIFINDEX, ðreq);
struct sockaddr_ll sll;
bzero(&sll, sizeof(sll));
sll.sll_ifindex = ethreq.ifr_ifindex;
sendto(sockfd, buf, len, 0, (struct sockaddr *)&sll, sizeof(sll));
}
}
}
}
}
int main(int argc, char const *argv[])
{
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sockfd == -1)
{
perror("sockfd");
}
pthread_t tid;
pthread_create(&tid, NULL, deal_fun, (void *)sockfd);
pthread_detach(tid);
sleep(100000);
close(sockfd);
return 0;
}
#ifndef GET_INTERFACE_H
#define GET_INTERFACE_H
#define MAXINTERFACES 16
typedef struct interface{
char name[20];
unsigned char ip[4];
unsigned char mac[6];
unsigned char netmask[4];
unsigned char br_ip[4];
int flag;
}INTERFACE;
extern INTERFACE net_interface[MAXINTERFACES];
extern void getinterface();
int get_interface_num();
#endif
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/ether.h>
#include "get_interface.h"
int interface_num=0;
INTERFACE net_interface[MAXINTERFACES];
int get_interface_num(){
return interface_num;
}
void getinterface(){
struct ifreq buf[MAXINTERFACES];
struct ifconf ifc;
int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t) buf;
if (ioctl(sock_raw_fd, SIOCGIFCONF, (char *) &ifc) == -1){
perror("SIOCGIFCONF ioctl");
return ;
}
interface_num = ifc.ifc_len / sizeof(struct ifreq);
printf("interface_num=%d\n\n", interface_num);
char buff[20]="";
int ip;
int if_len = interface_num;
while (if_len-- > 0){
printf("%s\n", buf[if_len].ifr_name);
sprintf(net_interface[if_len].name, "%s", buf[if_len].ifr_name);
printf("-%d-%s--\n",if_len,net_interface[if_len].name);
if (!(ioctl(sock_raw_fd, SIOCGIFFLAGS, (char *) &buf[if_len]))){
if (buf[if_len].ifr_flags & IFF_UP){
printf("UP\n");
net_interface[if_len].flag = 1;
}
else{
printf("DOWN\n");
net_interface[if_len].flag = 0;
}
}else{
char str[256];
sprintf(str, "SIOCGIFFLAGS ioctl %s", buf[if_len].ifr_name);
perror(str);
}
if (!(ioctl(sock_raw_fd, SIOCGIFADDR, (char *) &buf[if_len]))){
printf("IP:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
bzero(buff,sizeof(buff));
sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
inet_pton(AF_INET, buff, &ip);
memcpy(net_interface[if_len].ip, &ip, 4);
}else{
char str[256];
sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
perror(str);
}
if (!(ioctl(sock_raw_fd, SIOCGIFNETMASK, (char *) &buf[if_len]))){
printf("netmask:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
bzero(buff,sizeof(buff));
sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
inet_pton(AF_INET, buff, &ip);
memcpy(net_interface[if_len].netmask, &ip, 4);
}else{
char str[256];
sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
perror(str);
}
if (!(ioctl(sock_raw_fd, SIOCGIFBRDADDR, (char *) &buf[if_len]))){
printf("br_ip:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
bzero(buff,sizeof(buff));
sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
inet_pton(AF_INET, buff, &ip);
memcpy(net_interface[if_len].br_ip, &ip, 4);
}else{
char str[256];
sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
perror(str);
}
if (!(ioctl(sock_raw_fd, SIOCGIFHWADDR, (char *) &buf[if_len]))){
printf("MAC:%02x:%02x:%02x:%02x:%02x:%02x\n\n",
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[0],
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[1],
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[2],
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[3],
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[4],
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[5]);
memcpy(net_interface[if_len].mac, (unsigned char *)buf[if_len].ifr_hwaddr.sa_data, 6);
}else{
char str[256];
sprintf(str, "SIOCGIFHWADDR ioctl %s", buf[if_len].ifr_name);
perror(str);
}
}
close(sock_raw_fd);
}