#include <netinet/if_ether.h>
/*
* FUNC: Get peer MAC address by socket built
* PARAM: ifname--network interface name; peerip--peer ip address; sockfd--socket ; buf--MAC address, buflen--buf size;
* RET: 0--OK; else--Fail
*/
int getpeermac(char *ifname, struct sockaddr_in *peerip, int sockfd, char *buf , int buflen)
{
int ret = -1;
struct arpreq arpreq;
if(ifname==NULL || peerip==NULL || buf==NULL)
return -1;
memset( &arpreq, 0, sizeof( struct arpreq ));
memcpy( &arpreq.arp_pa, peerip, sizeof( struct sockaddr_in ));
strcpy(arpreq.arp_dev, ifname);
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNSPEC;
if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 ) {
printf("ioctl SIOCGARP error from %s", ifname);
return -1;
}
else
{
unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;
memcpy(buf, ptr, 6);
ret = 0;
}
return ret;
}
/*
* FUNC: Get peer MAC address by socket built
* PARAM: ifname--network interface name; peerip--peer ip address; sockfd--socket ; buf--MAC address, buflen--buf size;
* RET: 0--OK; else--Fail
*/
int getpeermac(char *ifname, struct sockaddr_in *peerip, int sockfd, char *buf , int buflen)
{
int ret = -1;
struct arpreq arpreq;
if(ifname==NULL || peerip==NULL || buf==NULL)
return -1;
memset( &arpreq, 0, sizeof( struct arpreq ));
memcpy( &arpreq.arp_pa, peerip, sizeof( struct sockaddr_in ));
strcpy(arpreq.arp_dev, ifname);
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNSPEC;
if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 ) {
printf("ioctl SIOCGARP error from %s", ifname);
return -1;
}
else
{
unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;
memcpy(buf, ptr, 6);
ret = 0;
}
return ret;
}