在vxworks6.6以及以后的版本如何获得主机IP获得MAC地址
zbsyt 2015-12-12 11:59:03 vxworks 5.5的arpResolve函数已经被取消了。
我觉得正确的方法应该是通过 ioctl(sd, SIOCGARP, &arpreq),但是在vxwork6.6中取不到MAC
(参见后面的代码)
routec “show” 虽然可以显示出arp表里的主机mac地址,但是只是打印出来,无法通过程序调用。
如果通过socket(PF_ROUTE, SOCK_RAW, 0)的方法读取路由表的方法也并行。
请问谁有其他方法吗?
谢谢。
void arp_get(char *ip)
{
int sd;
struct arpreq arpreq;
struct sockaddr_in *sin;
unsigned char *hw_addr;
int rc;
printf("Find arp entry for IP : %s\n", ip);
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0){
perror("socket() error\n");
exit(1);
}
/*you must add this becasue some system will return "Invlid argument"
because some argument isn't zero */
memset(&arpreq, 0, sizeof(struct arpreq));
sin = (struct sockaddr_in *) &arpreq.arp_pa;
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = inet_addr(ip);
rc = ioctl(sd, SIOCGARP, &arpreq);
if (rc < 0)
{
printf("%s%d\n", "Entry not available in cache... \n", rc);
hw_addr = (unsigned char *) arpreq.arp_ha.sdl_data;
printf("HWAddr found : %02x:%02x:%02x:%02x:%02x:%02x\n",
hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[3], hw_addr[4],
hw_addr[5]);
return -1;
} else
{
printf("%s\n", "entry has been successfully retreived");
hw_addr = (unsigned char *) arpreq.arp_ha.sdl_data;
printf("HWAddr found : %02x:%02x:%02x:%02x:%02x:%02x\n",
hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[3], hw_addr[4],
hw_addr[5]);
}
return 0;
}