|
楼主 |
发表于 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"读出来 |
|