|
楼主 |
发表于 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响应数据
根本没有到来.请问这又是怎么回事呢? |
|