|
发表于 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了。可是我最近很忙,没时间研究了。
版主帮忙看下吧! |
|