arp获取
2015-07-17 14:33
399 查看
getarp.c
ioctl 读取和清空arp表
/* getarp.c -- This simple program uses an IOCTL socket call to read an entry */ /* from the ARP cache of the local machine. Original source unknown. */ /* Usage: getarp <ip-number> */ /* Example: getarp 148.85.2.1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <net/if_arp.h> /* arp_flags and at_flags field values */ #define ATF_INUSE 0x01 /* entry in use */ #define ATF_COM 0x02 /* completed entry (enaddr valid) */ #define ATF_PERM 0x04 /* permanent entry */ #define ATF_PUBL 0x08 /* publish entry (respond for other host) */ #define ATF_USETRAILERS 0x10 /* has requested trailers */ #define ATF_PROXY 0x20 /* Do PROXY arp */ main (int argc, char *argv[]) { int s; struct arpreq arpreq; struct sockaddr_in *sin; unsigned char *eap; if (argc < 2) exit(0); memset(&arpreq, 0, sizeof(arpreq)); sin = (struct sockaddr_in *) &arpreq.arp_pa; sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(argv[1]); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("socket"); exit(0); } strcpy(arpreq.arp_dev, "eth0"); if (ioctl(s, SIOCGARP, &arpreq) < 0) { perror("ioctl"); exit(0); } printf("IP address: %s\n", inet_ntoa(sin->sin_addr)); if (arpreq.arp_flags & ATF_COM) { eap = (unsigned char *) &arpreq.arp_ha.sa_data[0]; printf("Ethernet address: %02X:%02X:%02X:%02X:%02X:%02X", eap[0], eap[1], eap[2], eap[3], eap[4], eap[5]); if (arpreq.arp_flags & ATF_PERM) printf(" PERM"); if (arpreq.arp_flags & ATF_PUBL) printf(" PUBLISHED"); if (arpreq.arp_flags & ATF_USETRAILERS) printf(" TRAILERS"); if (arpreq.arp_flags & ATF_PROXY) printf(" PROXY"); printf("\n"); } else { printf("*** INCOMPLETE ***\n"); } close(s); exit(0); }
ioctl 读取和清空arp表
#include <stdio.h> #include <sys/param.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <errno.h> #include <netdb.h> //#include "nlist.h" #include <net/if.h> #include <netinet/if_ether.h> extern int errno; main(argc, argv) char **argv; { if (argc >= 2 && strcmp(argv[1], "-a") == 0) { #ifdef pdp11 char *kernel = "/netnix", *mem = "/dev/mem"; #else char *kernel = "/unix", *mem = "/dev/kmem"; #endif if (argc >= 3) kernel = argv[2]; if (argc >= 4) mem = argv[3]; // dump(kernel, mem); exit(0); } if (argc == 2) { get(argv[1]); exit(0); } if (argc >= 4 && strcmp(argv[1], "-s") == 0) { printf("\n in set addr"); if (set(argc-2, &argv[2])) exit(1); exit(0); } if (argc == 3 && strcmp(argv[1], "-d") == 0) { delete(argv[2]); exit(0); } if (argc == 3 && strcmp(argv[1], "-f") == 0) { if (file(argv[2])) exit(1); exit(0); } usage(); exit(1); } /* * Process a file to set standard arp entries */ file(name) char *name; { FILE *fp; int i; char line[100], arg[5][50], *args[5]; int retval; if ((fp = fopen(name, "r")) == NULL) { fprintf(stderr, "arp: cannot open %s\n", name); exit(1); } args[0] = &arg[0][0]; args[1] = &arg[1][0]; args[2] = &arg[2][0]; args[3] = &arg[3][0]; args[4] = &arg[4][0]; retval = 0; while(fgets(line, 100, fp) != NULL) { i = sscanf(line, "%s %s %s %s %s", arg[0], arg[1], arg[2], arg[3], arg[4]); if (i < 2) { fprintf(stderr, "arp: bad line: %s\n", line); retval = 1; continue; } if (set(i, args)) retval = 1; } fclose(fp); return (retval); } /* * Set an individual arp entry */ set(argc, argv) char **argv; { struct arpreq ar; struct hostent *hp; struct sockaddr_in *sin; u_char *ea; int s; char *host = argv[0], *eaddr = argv[1]; printf("\nargv[0]=%s",argv[0]); printf("\nargv[1]=%s",argv[1]); argc -= 2; argv += 2; bzero((caddr_t)&ar, sizeof ar); sin = (struct sockaddr_in *)&ar.arp_pa; sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(host); if (sin->sin_addr.s_addr == -1) { hp = gethostbyname(host); if (hp == NULL) { fprintf(stderr, "arp: %s: unknown host\n", host); return (1); } bcopy((char *)hp->h_addr, (char *)&sin->sin_addr, sizeof sin->sin_addr); } ea = (u_char *)ar.arp_ha.sa_data; if (ether_aton(eaddr, ea)) return (1); ar.arp_flags = ATF_PERM; while (argc-- > 0) { if (strncmp(argv[0], "temp", 4) == 0) ar.arp_flags &= ~ATF_PERM; if (strncmp(argv[0], "pub", 3) == 0) ar.arp_flags |= ATF_PUBL; if (strncmp(argv[0], "trail", 5) == 0) ar.arp_flags |= ATF_USETRAILERS; argv++; } s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("arp: socket"); exit(1); } if (ioctl(s, SIOCSARP, (caddr_t)&ar) < 0) { perror(host); exit(1); } close(s); return (0); } /* * Display an individual arp entry */ get(host) char *host; { struct arpreq ar; struct hostent *hp; struct sockaddr_in *sin; u_char *ea; int s; bzero((caddr_t)&ar, sizeof ar); ar.arp_pa.sa_family = AF_INET; sin = (struct sockaddr_in *)&ar.arp_pa; sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(host); if (sin->sin_addr.s_addr == -1) { hp = gethostbyname(host); if (hp == NULL) { fprintf(stderr, "arp: %s: unknown host\n", host); exit(1); } bcopy((char *)hp->h_addr, (char *)&sin->sin_addr, sizeof sin->sin_addr); } s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("arp: socket"); exit(1); } if (ioctl(s, SIOCGARP, (caddr_t)&ar) < 0) { if (errno == ENXIO) printf("%s (%s) -- no entry\n", host, inet_ntoa(sin->sin_addr)); else perror("SIOCGARP"); exit(1); } close(s); ea = (u_char *)ar.arp_ha.sa_data; printf("%s (%s) at ", host, inet_ntoa(sin->sin_addr)); if (ar.arp_flags & ATF_COM) ether_print(ea); else printf("(incomplete)"); if (ar.arp_flags & ATF_PERM) printf(" permanent"); if (ar.arp_flags & ATF_PUBL) printf(" published"); if (ar.arp_flags & ATF_USETRAILERS) printf(" trailers"); printf("\n"); } /* * Delete an arp entry */ delete(host) char *host; { struct arpreq ar; struct hostent *hp; struct sockaddr_in *sin; int s; bzero((caddr_t)&ar, sizeof ar); ar.arp_pa.sa_family = AF_INET; sin = (struct sockaddr_in *)&ar.arp_pa; sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(host); if (sin->sin_addr.s_addr == -1) { hp = gethostbyname(host); if (hp == NULL) { fprintf(stderr, "arp: %s: unknown host\n", host); exit(1); } bcopy((char *)hp->h_addr, (char *)&sin->sin_addr, sizeof sin->sin_addr); } s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("arp: socket"); exit(1); } if (ioctl(s, SIOCDARP, (caddr_t)&ar) < 0) { if (errno == ENXIO) printf("%s (%s) -- no entry\n", host, inet_ntoa(sin->sin_addr)); else perror("SIOCDARP"); exit(1); } close(s); printf("%s (%s) deleted\n", host, inet_ntoa(sin->sin_addr)); } ether_print(cp) u_char *cp; { printf("%x:%x:%x:%x:%x:%x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]); } ether_aton(a, n) char *a; u_char *n; { int i, o[6]; i = sscanf(a, "%x:%x:%x:%x:%x:%x", &o[0], &o[1], &o[2], &o[3], &o[4], &o[5]); if (i != 6) { fprintf(stderr, "arp: invalid Ethernet address '%s'\n", a); return (1); } for (i=0; i<6; i++) n = o; return (0); } usage() { printf("Usage: arp hostname\n"); printf(" arp -a [/vmunix] [/dev/kmem]\n"); printf(" arp -d hostname\n"); printf(" arp -s hostname ether_addr [temp] [pub] [trail]\n"); printf(" arp -f filename\n"); }
相关文章推荐
- 红宝书
- 语法错误 : 缺少“;”(在“<”的前面)
- IOS集合NSSet与NSMutableSet知识点
- 学习 AngularJs 终于有点进步了。
- ALERT日志中常见监听相关报错之三:ORA-609 TNS-12537 and TNS-12547 or TNS-12170 TNS-12535错误的排查
- JNIEnv解析
- C# 日期大小比较以及日期格式化
- CentOS yum源的配置
- ios开发之uitextview及uitextfield获得焦点时弹出的键盘及键盘上面的附加view设置
- python 面向对象 继承
- 8. JavaScript HTML DOM 事件
- 教程-EhLib70的安装方法
- 【原创】学习{我的mysql学习心得}的笔记
- iOS开发编译时候报的错误和解决办法收集
- 输入底面半径和高,求圆柱体的表面积
- 分享微信及朋友圈(基于友盟)
- HDU3652.B-number
- Android -- EventBus解析
- 教程-delphi的开源json库:superobject,用法简介
- Android中写入读取XML