getarp.c

/*  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");
}

arp获取的更多相关文章

  1. 使用ARP获取局域网内设备IP和MAC地址

    根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...

  2. 图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)

    一.代理ARP概述 我:当电脑要访问互联网上的服务器,目标MAC是什么? 很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的MAC嘛! 这时我会反问:那电脑怎么拿到这个服务器的MAC地 ...

  3. 一文详解 ARP 协议

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 公众号连载计算机网络文章如下 ARP,这个隐匿在计网 ...

  4. Neutron 理解 (6): Neutron 是怎么实现虚拟三层网络的 [How Neutron implements virtual L3 network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  5. Neutron 理解 (8): Neutron 是如何实现虚机防火墙的 [How Neutron Implements Security Group]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  6. 理解 OpenStack 高可用(HA)(3):Neutron 分布式虚拟路由(Neutron Distributed Virtual Routing)

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  7. 理解 Linux 网络栈(1):Linux 网络协议栈简单总结

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  8. 《图解TCP/IP》

    MAC寻址:地址转发表:IP寻址:路由控制表. 网卡(网络接口卡),NIC. 循环复用DNS技术. 代理服务器是一种应用网关.防火墙. LLC是Logical Link Control的缩写,意为:逻 ...

  9. vlan知识

    为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...

随机推荐

  1. React Router 4.0 实现路由守卫

    在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...

  2. 20145234黄斐《Java程序设计》第一周学习总结

    教材学习内容总结 1.java是SUN公司推出的面相网络的编程语言,当时取名Oak,后改名Java. 2.Java三大平台分别为:Java SE.Java EE与Java ME. 3.Java不仅是程 ...

  3. 成都Uber优步司机奖励政策(2月1日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. [python]安装wxpython的时候遇到问题记录

    一.安装wxpython的时候报错 “no installation of python 2.7 found in registy” 解决方案: win7上,已经安装python27,但是在安装wxp ...

  5. 2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...

  6. Spring Boot中使用缓存

    Spring Boot中使用缓存 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一. 原始的使 ...

  7. cakephp2.x 多个应用程序公用一个核心类库

    环境Windows,apache,cake版本2.3.3 Cake项目路径 D:\wamp\www\Mycakephp 浏览器打开 http://localhost/Mycakephp 能够正常访问到 ...

  8. Selenium 入门到精通系列:四

    Selenium 入门到精通系列 PS:鼠标右键.鼠标悬停.键盘操作方法 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019 ...

  9. 互联网行业求职课-教你进入BAT

    互联网行业求职课--教你进入BAT 课时1. 课程内容介绍.导师介绍.服务安排和介绍等 课时2. 互联网行业.职业选择指导 互联网公司选择: 大公司:收获:大平台,系统思维,系统培训,系统性的发展,薪 ...

  10. nodejs promise深度解析

    Promise本质上是一个容器,内部有一个执行函数,当promise对象New出来的时候,内部包裹的函数立即执行. V8引擎会将resolve和projeccted两个函数传递进来,resolved含 ...