找回密码
 注册
查看: 2073|回复: 18

怎样获得网卡的物理地址

[复制链接]
发表于 2005-7-10 16:36:09 | 显示全部楼层 |阅读模式
如题,谢谢!!!
发表于 2005-7-10 16:46:29 | 显示全部楼层
拆开机箱,拿出网卡,用抹布擦一下,再看标签

嘿嘿~

看看ifconfig的源码
回复

使用道具 举报

 楼主| 发表于 2005-7-10 16:54:44 | 显示全部楼层
是一种方法,不过有种杀鸡取卵的感觉,系统在启动自检的时候肯定把
这个地址存放在哪个地方的,再说难道每次把我的程序移植到另外的
机器上,都要人家先拔网卡看地址?不现实
回复

使用道具 举报

发表于 2005-7-10 16:56:54 | 显示全部楼层
是啊,确实不现实。

最现实的是人家写好了给你。
回复

使用道具 举报

发表于 2005-7-10 16:59:58 | 显示全部楼层
gugong真是直击要害啊

嘿嘿~

用kudzu[code:1]
[root@Lover net]$ kudzu -p|grep network.hwaddr:
network.hwaddr: 00:00:00:00:00:00
[root@Lover net]$
[/code:1]
回复

使用道具 举报

发表于 2005-7-11 09:15:01 | 显示全部楼层
ioctl(int sockfd, SIOCGIFHWADDR, struct ifreq *ifr)
回复

使用道具 举报

 楼主| 发表于 2005-7-11 10:46:09 | 显示全部楼层
解决了,正如楼上所列出的代码,具体来说是:
#include <net/if.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
struct ifreq ifr;
if (argc!=2)
{
fprintf(stderr, "usage:%s interface name", argv[0]);
exit(1);
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, argv[1], 16);
int fd=socket(PF_INET, SOCK_DGRAM, 0);
if(fd<0)
{
perror("socket()");
exit(1);
}
if (ioctl(fd, SIOCGIFHWADDR, &ifr)<0)
{
perror("ioctl()get hardware address error:");
exit(1);
}
else
{
unsigned char *pa=(unsigned char*)&ifr.ifr_hwaddr.sa_data;
printf("Interface:%s Hardware Address:%02X:%02X:%02X:%02X:%02X:%02X\n",
ifr.ifr_name, pa[0], pa[1], pa[2], pa[3], pa[4], pa[5]);
}
exit(0);
}

////////////////////////////////
gcc -c main.c
gcc -o main.o main
./main eth0
回复

使用道具 举报

 楼主| 发表于 2005-7-11 10:49:14 | 显示全部楼层
在追加问一个问题,怎样获得与自己相连的路由器的MAC地址
回复

使用道具 举报

发表于 2005-7-11 12:58:42 | 显示全部楼层
[code:1]2005年07月11日星期一下午13时00分18秒[root@yltc root]# gcc -c main.c
2005年07月11日星期一下午13时00分30秒[root@yltc root]# gcc -o main.o main
gcc: main: 没有那个文件或目录
gcc: no input files
2005年07月11日星期一下午13时00分39秒[root@yltc root]# gcc -o main main.o
2005年07月11日星期一下午13时00分56秒[root@yltc root]# ./main eth0
Interface:eth0 Hardware Address:00:11:D8:74:CD:FC
2005年07月11日星期一下午13时01分03秒[root@yltc root]#[/code:1]
回复

使用道具 举报

发表于 2005-7-11 13:25:52 | 显示全部楼层
[quote:94fc17c2fa="hhuzhang"]在追加问一个问题,怎样获得与自己相连的路由器的MAC地址[/quote]

socket(PF_PACKET, SOCK_RAW, 0);
发arp包试试。
回复

使用道具 举报

 楼主| 发表于 2005-7-12 09:47:50 | 显示全部楼层
楼上的兄台,好像用socket(PF_PACKET, SOCK_RAW, 0);创建的套接字去进行联接会报错啊
请问该怎么办?
回复

使用道具 举报

 楼主| 发表于 2005-7-12 10:03:56 | 显示全部楼层
刚刚又试了一下,源代码:
#include <net/if.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arp_head.h"

#define     EPT_IP            0x0800 /* type: IP */
#define     EPT_ARP          0x0806 /* type: ARP */
#define     EPT_RARP         0x8035 /* type: RARP */
#define     ARP_HARDWARE   0x0001 /* Dummy type for 802.3 frames */
#define     ARP_REQUEST     0x0001 /* ARP request */
#define     ARP_REPLY       0x0002 /* ARP reply */
#define     DES_PORT           80


int main(int argc, char *argv[])
{
   struct ifreq ifr;
   struct arp_frame arp_pack;
   struct sockaddr_in  sevcaddr;
   unsigned char *local_mac;
   int socket_fd;
   int i;
   
   memset(&arp_pack, 0xff, sizeof( struct arp_frame));
   //memset(arp_pack.dlc_hdr.snder_mac, 0x00, 5);
     
   memset(&ifr, 0, sizeof(ifr));
   strncpy(ifr.ifr_name, "eth0", 16);
   int fd=socket(PF_INET, SOCK_DGRAM, 0);

   if( fd<0)
   {
     perror("socket()");
     exit(1);
   }

   if ( ioctl(fd, SIOCGIFHWADDR, &ifr) <0)
   {
     perror("ioctl()get hardware address error:");
     exit(1);
   }

   else
   {
     local_mac=(unsigned char*)&ifr.ifr_hwaddr.sa_data;
   }

   for (i =0; i<6; i++)
   {
      memcpy(&(arp_pack.dlc_hdr.snder_mac), local_mac, 1);
      local_mac++;
   }

   arp_pack.dlc_hdr.eth_type = htons(EPT_ARP);
   arp_pack.arp_hdr.hardware_type = htons(ARP_HARDWARE);
   arp_pack.arp_hdr.up_stair_type = htons(EPT_IP);
   arp_pack.arp_hdr.mac_addr_len = 6;
   arp_pack.arp_hdr.ip_addr_len = 4;
   arp_pack.arp_hdr.opt_code = htons(ARP_REQUEST);
   
   memcpy(arp_pack.arp_hdr.snd_mac, arp_pack.dlc_hdr.snder_mac, 6);
   arp_pack.arp_hdr.snd_ip = inet_addr("192.168.1.28");
   arp_pack.arp_hdr.rcv_ip = inet_addr("192.168.1.26");

   sevcaddr.sin_family = AF_INET;
   sevcaddr.sin_port = htons(IPPORT_USERRESERVED+DES_PORT);
   sevcaddr.sin_addr.s_addr = inet_addr("192.168.1.26");
   bzero(&(sevcaddr.sin_zero), ;
   
   if ( (socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) <0)
   {
      perror("socket");
      exit(1);
   }
   
   if ( connect(socket_fd, (struct sockaddr *)&sevcaddr, sizeof(struct sockaddr)) <0)
   {
     perror("connect");
     exit(1);
   }

   if ( send(socket_fd, (void *)&arp_pack, sizeof(arp_pack), 0) <0)
   {
     perror("send");
     exit(1);
   }


   exit(0);
}

运行后再查ARP缓冲
[root@localhost root]# arp -vn -a
? (192.168.1.1) at 00:30:DA:28:6A:52 [ether] on eth0
? (192.168.1.26) at 00:E0:4C:EF:F2:3B [ether] on eth0
Entries: 2      Skipped: 0      Found: 2
发现多了下面一条记录
现在的问题就是如何把"00:E0:4C:EF:F2:3B"读出来
回复

使用道具 举报

发表于 2005-7-12 13:03:00 | 显示全部楼层
解析arp响应包就可以了
回复

使用道具 举报

发表于 2005-7-12 13:04:16 | 显示全部楼层
[quote:74df9074fd="hhuzhang"]楼上的兄台,好像用socket(PF_PACKET, SOCK_RAW, 0);创建的套接字去进行联接会报错啊
请问该怎么办?[/quote]

connect??用connect做什么?
回复

使用道具 举报

 楼主| 发表于 2005-7-12 15:26:30 | 显示全部楼层
怎样解析响应ARP包呢?
发送的时候难道不要先建立连接吗?我把connect函数去掉后,运行提示:
send: No such device or address
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-2-8 06:31 , Processed in 0.027830 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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