1.arp_link.c
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "arp_link.h"
ARP_LINK *arp_head=NULL;
/******************************************************************
函 数: void free_arp_link(ARP_LINK *head)
功 能: 释放ARP链表
参 数: ARP_LINK *head ARP链表头
返回值: 无
*******************************************************************/
void free_arp_link(ARP_LINK *head){
ARP_LINK *pb = head;
while(head){
pb = head->next;
free(head);
head = pb;
}
}
/******************************************************************
函 数: void printf_arp_link(ARP_LINK *head)
功 能: 打印ARP链表
参 数: ARP_LINK *head ARP链表头
返回值: 无
*******************************************************************/
void printf_arp_link(ARP_LINK *head){
ARP_LINK *pb = head;
while(pb){
printf("IP:%d.%d.%d.%d---", pb->ip[0],pb->ip[1],pb->ip[2],pb->ip[3]);
printf("MAC:%02x:%02x:%02x:%02x:%02x:%02x\n",
pb->mac[0],pb->mac[1],pb->mac[2],pb->mac[3],pb->mac[4],pb->mac[5]);
pb = pb->next;
}
}
/******************************************************************
函 数: ARP_LINK *find_arp_from_ip(ARP_LINK *head, unsigned char *ip)
功 能: 根据IP查找MAC
参 数: ARP_LINK *head ARP链表头 unsigned char *ip IP地址
返回值: ARP_LINK *查找到的节点
*******************************************************************/
ARP_LINK *find_arp_from_ip(ARP_LINK *head, unsigned char *ip){
ARP_LINK *pb = head;
//printf("查找的ip包**********************:%d\n",ntohs(*(unsigned short *)ip));//ntohs(*(unsigned short *)
while(pb){
if(memcmp(pb->ip,ip,4)==0){
//printf("查到ip包**********************:%d\n",ntohs(*(unsigned short *)(pb->ip)));
break;
}
//printf("查不到\n");
pb = pb->next;
}
return pb;
}
/******************************************************************
函 数: ARP_LINK *inner_arp_link(ARP_LINK *head,ARP_LINK* p)
功 能: 插入ARP链表
参 数: ARP_LINK *head ARP链表头 unsigned char *ip IP地址
返回值: ARP_LINK *head ARP链表头
*******************************************************************/
ARP_LINK *inner_arp_link(ARP_LINK *head,ARP_LINK* p){
ARP_LINK *pb = find_arp_from_ip(head, p->ip);//查找是否有该记录
if(pb==NULL){//未查找到,插入链表,直接插入表头方便
p->next = head;
head = p;
//printf("插入链表成功\n");
}else{//查找到,修改链表
memcpy(pb->mac,p->mac,6);//拷贝mac地址
}
return head;
}
2.arp_link.h
#ifndef ARP_LINK_H
#define ARP_LINK_H
typedef struct arp_link{
unsigned char ip[4];//ip地址四个字节
unsigned char mac[6];//mac地址六个字节
struct arp_link *next;
}ARP_LINK;
extern ARP_LINK *arp_head;
/******************************************************************
函 数: ARP_LINK *inner_arp_link(ARP_LINK *head,ARP_LINK* p)
功 能: 插入ARP链表
参 数: ARP_LINK *head ARP链表头 unsigned char *ip IP地址
返回值: ARP_LINK *head ARP链表头
*******************************************************************/
extern ARP_LINK *inner_arp_link(ARP_LINK *arp_head,ARP_LINK* p);
/******************************************************************
函 数: void printf_arp_link(ARP_LINK *head)
功 能: 打印ARP链表
参 数: ARP_LINK *head ARP链表头
返回值: 无
*******************************************************************/
extern void printf_arp_link(ARP_LINK *arp_head);
/******************************************************************
函 数: ARP_LINK *find_arp_from_ip(ARP_LINK *head, unsigned char *ip)
功 能: 根据IP查找MAC
参 数: ARP_LINK *head ARP链表头 unsigned char *ip IP地址
返回值: ARP_LINK *查找到的节点
*******************************************************************/
extern ARP_LINK *find_arp_from_ip(ARP_LINK *arp_head, unsigned char *ip);
/******************************************************************
函 数: void free_arp_link(ARP_LINK *head)
功 能: 释放ARP链表
参 数: ARP_LINK *head ARP链表头
返回值: 无
*******************************************************************/
extern void free_arp_link(ARP_LINK *arp_head);
#endif