通过客户端IP和服务端网卡名获取客户端Mac地址

#include <stdio.h> 
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if_arp.h>
#include <string.h>

int arpGet(const char *ifname, const char *ipStr)
{
	if(ifname == NULL || ipStr == NULL)
	{
		printf("para is null.\n");
		return -1;
	}
 
	struct arpreq req;
	struct sockaddr_in *sin;
	int ret = 0;
	int sock_fd = 0;
 
	memset(&req, 0, sizeof(struct arpreq));
 
	sin = (struct sockaddr_in *)&req.arp_pa;
	sin->sin_family = AF_INET;
	sin->sin_addr.s_addr = inet_addr(ipStr);
 
	//arp_dev长度为[16],注意越界
	strcpy(req.arp_dev, ifname);
 
	sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sock_fd < 0)
	{
		printf("get socket error.\n");
		return -1;
	}
 
	ret = ioctl(sock_fd, SIOCGARP, &req);
	if(ret < 0)
	{
		printf("ioctl error.\n");
		close(sock_fd);
		return -1;
	}
 
	unsigned char *hw = (unsigned char *)req.arp_ha.sa_data;
	printf("%02X:%02X:%02X:%02X:%02X:%02X\n", hw[0], hw[1], hw[2], hw[3], hw[4], hw[5]);
	printf("%#x\n", req.arp_flags);
	close(sock_fd);
	return 0;
}

int main(void)
{
	arpGet("wlan0", "10.42.0.186");


	return 0;
}
posted @ 2020-09-11 15:52  sfdevs  阅读(156)  评论(0)    收藏  举报