arp获取

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




转载于:https://www.cnblogs.com/carlos-liye/p/6681319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值