LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1860|回复: 13

用linux下的c 语言如何实现不通过ip直接获取mac地址?

[复制链接]
发表于 2006-11-5 20:14:05 | 显示全部楼层 |阅读模式
如题
请高手指点!!
发表于 2006-11-5 20:46:44 | 显示全部楼层
你可真是有创意,不过我可以肯定的告诉你。
有!

不过我要看你要获得谁的MAC地址。
我前己天也问类似的问题了。
我成功获得了网关的MAC地址。不过我没用IP作参数。
我先获得了MAC的IP地址。然后再查询ARP缓存获得了网关MAC地址。
不过你的直接两个字我不太明白,没有IP,你怎么弄MAC地址。
就算系统中有MAC地址,你不给个条件,怎么返回给你信息。

不过还是有方法。比如你可以不用IP,直接获得所有ARP缓存中的MAC地址。
而且还比较简单。
不过一般人我不告诉他。。。。。。(没人喜欢那么用)
等你把你的问题说清楚了,我再告诉你。
回复 支持 反对

使用道具 举报

发表于 2006-11-5 20:48:19 | 显示全部楼层
是指直接读取网卡的EEPROM??有些板载的网卡不一定有这玩意。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-5 21:04:23 | 显示全部楼层
怎么说呢
我一时心血来潮
没有为什么这么做,只有想这么做
当有这么个想法时就特别的想去实现他,觉得很有趣

我现在有两个期望实现的目的:
1.用linux下的c获取本机的mac地址,不要通过传统的通过ip中介来获得,我说的“直接获得”,我也讲不清楚怎么个直接法,因为我并没有思路,反正就是不通过3层便获取这个地址,大概就是这么个意思
2.用linux下的c获取一跳内邻居机的mac地址,也用类似于1的方式,
不知道可不可以实现
对这个想法我很兴奋,非常想实现它们
请教指点!
回复 支持 反对

使用道具 举报

发表于 2006-11-5 21:05:29 | 显示全部楼层
没必要那么麻烦,几乎不需要什么技术。
很简单。你先是复制标准输出描述符号(或者重定向)。
然后用system("arp");
然后你再分析数据好了。这么干似乎有点笨。早说没人喜欢用了。

本来不想说的,我刚发完回帖,楼主就回了。谢谢楼主上次
提供的方法。我把那些代码写出来了。不过有个问题。就是
我机器中ioctl怎么时常失败。
本来想把代码贴上来。不过太长了。伊甸园里有人发了一个简单的获得MAC地址的代码。
和我的部份功能一样。
同样
我运行时有时好有时出错。
#include <stdio.h>
#include <string.h>

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

int main(int argc, char **argv)
{
int sockfd;
unsigned char *ptr;
struct arpreq arpreq;
struct sockaddr_in *sin;
struct sockaddr_storage ss;
char addr[INET_ADDRSTRLEN+1];


memset(addr, 0, INET_ADDRSTRLEN+1);
memset(&ss, 0, sizeof(ss));

if (argc != 2) {
printf("USAGE arpg ip_addr\n");
return -1;
}

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket error");
return -1;
}

sin = (struct sockaddr_in *) &ss;
sin->sin_family = AF_INET;

if (inet_pton(AF_INET, argv[1], &(sin->sin_addr)) <= 0) {
perror("inet_pton error");
return -1;
}

sin = (struct sockaddr_in *) &arpreq.arp_pa;
memcpy(sin, &ss, sizeof(struct sockaddr_in));
strcpy(arpreq.arp_dev, "eth0");
arpreq.arp_ha.sa_family = AF_UNSPEC;

if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {
        perror("ioctl SIOCGARP: ");
        return -1;
}

ptr = (unsigned char *)arpreq.arp_ha.sa_data;
printf("%x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));

return 0;
}

你看看到底是内核的什么问题。

我平均失败次数是1/2。

而我那个程序更是,有时 连续失败N次。显示ioctl SIOCSARP: : Invalid argument
可是有时又能成功。
我怀疑是内核的BUG了。可是我最近很忙,没时间研究了。
版主帮忙看下吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-5 21:15:55 | 显示全部楼层
十分感谢楼上!
同样期待大家一起解决楼上的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-5 21:19:58 | 显示全部楼层
我编译执行了几下
结果都是
USAGE arpg ip_addr
回头研究下原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-5 21:32:28 | 显示全部楼层
不好意思
没看代码就执行
出错在所难免

不过
我发现代码中用了socket
我想在3层以下实现
不知道有没可能实现
继续请教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-5 21:33:24 | 显示全部楼层
不好意思
没看代码就执行
出错在所难免

不过
我发现代码中用了socket
我想在3层以下实现
不知道有没可能实现
继续请教!
回复 支持 反对

使用道具 举报

发表于 2006-11-7 15:11:11 | 显示全部楼层
什么叫3层以下?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表