⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arpping.c

📁 busybox-1.5.1.tar.gz linux内核编译用到的工具
💻 C
字号:
/* vi: set sw=4 ts=4: *//* * arpping.c * * Mostly stolen from: dhcpcd - DHCP client daemon * by Yoichi Hariguchi <yoichi@fore.com> */#include <netinet/if_ether.h>#include <net/if_arp.h>#include "common.h"#include "dhcpd.h"struct arpMsg {	/* Ethernet header */	uint8_t  h_dest[6];			/* destination ether addr */	uint8_t  h_source[6];			/* source ether addr */	uint16_t h_proto;			/* packet type ID field */	/* ARP packet */	uint16_t htype;				/* hardware type (must be ARPHRD_ETHER) */	uint16_t ptype;				/* protocol type (must be ETH_P_IP) */	uint8_t  hlen;				/* hardware address length (must be 6) */	uint8_t  plen;				/* protocol address length (must be 4) */	uint16_t operation;			/* ARP opcode */	uint8_t  sHaddr[6];			/* sender's hardware address */	uint8_t  sInaddr[4];			/* sender's IP address */	uint8_t  tHaddr[6];			/* target's hardware address */	uint8_t  tInaddr[4];			/* target's IP address */	uint8_t  pad[18];			/* pad for min. Ethernet payload (60 bytes) */} ATTRIBUTE_PACKED;/* args:	yiaddr - what IP to ping *		ip - our ip *		mac - our arp address *		interface - interface to use * retn:	1 addr free *		0 addr used *		-1 error *//* FIXME: match response against chaddr */int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface){	int	timeout = 2;	int	s;			/* socket */	int	rv = 1;			/* return value */	struct sockaddr addr;		/* for interface name */	struct arpMsg	arp;	fd_set		fdset;	struct timeval	tm;	time_t		prevTime;	s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));	if (s == -1) {		bb_perror_msg(bb_msg_can_not_create_raw_socket);		return -1;	}	if (setsockopt_broadcast(s) == -1) {		bb_perror_msg("cannot setsocketopt on raw socket");		close(s);		return -1;	}	/* send arp request */	memset(&arp, 0, sizeof(arp));	memcpy(arp.h_dest, MAC_BCAST_ADDR, 6);		/* MAC DA */	memcpy(arp.h_source, mac, 6);			/* MAC SA */	arp.h_proto = htons(ETH_P_ARP);			/* protocol type (Ethernet) */	arp.htype = htons(ARPHRD_ETHER);		/* hardware type */	arp.ptype = htons(ETH_P_IP);			/* protocol type (ARP message) */	arp.hlen = 6;					/* hardware address length */	arp.plen = 4;					/* protocol address length */	arp.operation = htons(ARPOP_REQUEST);		/* ARP op code */	memcpy(arp.sInaddr, &ip, sizeof(ip));		/* source IP address */	memcpy(arp.sHaddr, mac, 6);			/* source hardware address */	memcpy(arp.tInaddr, &yiaddr, sizeof(yiaddr));	/* target IP address */	memset(&addr, 0, sizeof(addr));	strcpy(addr.sa_data, interface);	if (sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr)) < 0)		rv = 0;	/* wait arp reply, and check it */	tm.tv_usec = 0;	prevTime = uptime();	while (timeout > 0) {		FD_ZERO(&fdset);		FD_SET(s, &fdset);		tm.tv_sec = timeout;		if (select(s + 1, &fdset, (fd_set *) NULL, (fd_set *) NULL, &tm) < 0) {			bb_perror_msg("error on ARPING request");			if (errno != EINTR) rv = 0;		} else if (FD_ISSET(s, &fdset)) {			if (recv(s, &arp, sizeof(arp), 0) < 0 ) rv = 0;			if (arp.operation == htons(ARPOP_REPLY) &&			    memcmp(arp.tHaddr, mac, 6) == 0 &&			    *((uint32_t *) arp.sInaddr) == yiaddr) {				DEBUG("Valid arp reply received for this address");				rv = 0;				break;			}		}		timeout -= uptime() - prevTime;		prevTime = uptime();	}	close(s);	DEBUG("%salid arp replies for this address", rv ? "No v" : "V");	return rv;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -