I try to write some code to set an ARP entry.
but the code at ioctl. alert a error: invalid argument.
WHY???
int setMac(char *dev, unsigned long ip, unsigned char *mac)
{
struct sockaddr addr;
struct sockaddr hw_addr;
struct arpreq req;
int sockfd, i;
/* default Mac to zero, in case we return an error */
memset(mac, '\0', 6);
memset(&addr, '\0', sizeof(addr));
addr.sa_family = AF_INET;
memcpy(&addr.sa_data[2], &ip, 4);
memset(&hw_addr, '\0', sizeof(hw_addr));
/*hw_addr.sa_family = ARPHRD_ETHER;*/
memcpy(hw_addr.sa_data, mac, 6);
memset(&req, '\0', sizeof(req));
memcpy(&req.arp_pa, &addr, sizeof(addr));
memcpy(&req.arp_dev[0], dev, sizeof(req.arp_dev));
memcpy(&req.arp_ha, &hw_addr, sizeof(hw_addr));
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket\n");
return (-1);
}
/* try to get an ARP mapping (if available)*/
if (ioctl(sockfd, SIOCSARP, (char *) &req) < 0)
{
printf("ioctl error:%s\n", strerror(errno));
close(sockfd);
return (-1);
}
close(sockfd);
return 0;
}
|