找回密码
 注册
楼主: hhuzhang

怎样获得网卡的物理地址

[复制链接]
发表于 2005-7-13 09:24:42 | 显示全部楼层
sendto
回复

使用道具 举报

 楼主| 发表于 2005-7-13 09:42:19 | 显示全部楼层
正如你说的,connect问题解决了,但是怎样解析一个ARP包呢?
非常感谢你对我的帮助
回复

使用道具 举报

发表于 2005-7-13 14:06:31 | 显示全部楼层
[quote:37539a86cd="hhuzhang"]正如你说的,connect问题解决了,但是怎样解析一个ARP包呢?
非常感谢你对我的帮助[/quote]

sendto一个arp请求包后再recvfrom一个arp回应包。
回复

使用道具 举报

 楼主| 发表于 2005-7-13 15:45:21 | 显示全部楼层
刚刚试过了,程序如下:
#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 <linux/sockios.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_snd, arp_rpl;
   struct sockaddr_in  sevcaddr;
   unsigned char *local_mac;
   int snd_sock, rcv_sock;
   int i;
   size_t addr_size;
   
   memset(&arp_snd, 0xff, sizeof(struct arp_frame));
   memset(&arp_rpl, 0xff, sizeof(struct arp_frame));
     
   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_snd.dlc_hdr.snder_mac), local_mac, 1);
      local_mac++;
   }

   memset(arp_snd.dlc_hdr.rcver_mac, 0xff, 6);
   arp_snd.dlc_hdr.eth_type = htons(EPT_ARP);
   arp_snd.arp_hdr.hardware_type = htons(ARP_HARDWARE);
   arp_snd.arp_hdr.up_stair_type = htons(EPT_IP);
   arp_snd.arp_hdr.mac_addr_len = 6;
   arp_snd.arp_hdr.ip_addr_len = 4;
   arp_snd.arp_hdr.opt_code = htons(ARP_REQUEST);
   
   memcpy(arp_snd.arp_hdr.snd_mac, arp_snd.dlc_hdr.snder_mac, 6);
   memset(arp_snd.arp_hdr.rcv_mac, 0xff, 6);
   arp_snd.arp_hdr.snd_ip = inet_addr("192.168.1.28");
   arp_snd.arp_hdr.rcv_ip = inet_addr("192.168.1.56");

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

   
   if ( (rcv_sock = socket(AF_INET, SOCK_DGRAM, 0)) <0)
   {
      perror("socket");
      exit(1);
   }

   printf("!!!\n");
   
   if ( recvfrom(rcv_sock, (void *)&arp_rpl, sizeof(arp_rpl), 0, (struct sockaddr *)&sevcaddr
             , &addr_size) <0)
   {
     perror("recvfrom");
     exit(1);
   }
   
   unsigned char *pa = (unsigned char *)&arp_rpl.dlc_hdr.rcver_mac;

   printf("%X:%X:%X:%X:%X:%X\n", pa[0], pa[1], pa[2], pa[3], pa[4], pa[5]);
   exit(0);
}

执行到函数recvfrom的时候,进程被阻塞了,也就是说目标机"192.168.1.56"的ARP响应数据
根本没有到来.请问这又是怎么回事呢?
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-2-8 06:19 , Processed in 0.037002 second(s), 13 queries .

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

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