在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;
}
...全文
9989 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaohe8 2016-11-18
  • 打赏
  • 举报
回复
vxworks6.8上用muxIoctl(muxDevAcquire("simnet", 0), EIOCGADDR, (caddr_t)pData)
gaohe8 2016-11-18
  • 打赏
  • 举报
回复
vxworks6.8上用(muxDevAcquire("simnet", 0), EIOCGADDR, (caddr_t)pData)
zbsyt 2015-12-16
  • 打赏
  • 举报
回复
谢谢,我的题目输入有误,主要是想根据主机的IP获得MAC地址。
daniel2k5 2015-12-16
  • 打赏
  • 举报
回复
貌似gethostaddr可以获得ip

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧