ioctl 관련 질문입니다.
글쓴이: swunk / 작성시간: 수, 2006/02/08 - 7:21오후
UNP 책에 나온 소스 입니다.
하나의 시스템에 할당된 ip 주소를 가지고 이에 해당 하는 mac 주소를 프린트하는 소스 코드 입니다.
ioctl을 사용하고 cmd로 SIOCGARP를 사용합니다.
그런데 아래와 같이 mac 주소가 출력이 안되네요...
뭐가 문젤까요 ?
127.0.0.1: ioctl SIOCGARP: No such device 130.154.16.209: ioctl SIOCGARP: No such device 10.1.1.1: ioctl SIOCGARP: No such device 10.4.1.1: ioctl SIOCGARP: No such device
소스 코드는 아래와 같습니다.
참고로 get_ifi_info() 함수는 시스템에 network interface 정보를 가져 오는 함수입니다.
1 #include "unpifi.h" 2 #include <net/if_arp.h> 3 4 int 5 main(int argc, char **argv) 6 { 7 int sockfd; 8 struct ifi_info *ifi; 9 unsigned char *ptr; 10 struct arpreq arpreq; 11 struct sockaddr_in *sin; 12 13 sockfd = Socket(AF_INET, SOCK_DGRAM, 0); 14 for (ifi = get_ifi_info(AF_INET, 0); ifi != NULL; ifi = ifi->ifi_next) { 15 printf("%s: ", Sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr_in))); 16 17 sin = (struct sockaddr_in *) &arpreq.arp_pa; 18 memcpy(sin, ifi->ifi_addr, sizeof(struct sockaddr_in)); 19 20 if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) { 21 err_ret("ioctl SIOCGARP"); 22 continue; 23 } 24 25 ptr = &arpreq.arp_ha.sa_data[0]; 26 printf("%x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1), 27 *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)); 28 } 29 exit(0); 30 }
Forums:
자답입니다.위의 결과가 올바른 결과 인것 같습니다.ioct
자답입니다.
위의 결과가 올바른 결과 인것 같습니다.
ioctl(fd, SIOCGARP, &arpreq);
시스템 콜을 호출하면 arpreq 안에는 시스템의 할당되어 있는 ip 주소값이 순서대로 들어가게 됩니다. (라인 18)
그래서 그 주소값을 key로 해서 arp hash 테이블을 검색하고 해당 키 값과 매칭되는 mac 주소를 arpreq 안에다가 넣어서 넘겨주면 해당 내용을 프린팅하게 되어 있더라구요..(라인 25~26)
리눅스 arp 테이블 안에는 당연히 자신의 시스템이 가지고 있는 ip 주소에 해당하는 엔트리는 없기 때문에 해당 mac 주소를 프린팅 하지 못하는 것 같습니다.
책에는 솔라리스에서 실행 시켰는데 솔라리스 arp table 캐쉬에는 아마도 자기 자신의 ip 주소와 이에 해당하는 mac 주소가 매핑되어 있을것 같습니다.
혹시 제가 잘못 이해했거나 위의 소스코드를 가지고 리눅스 에서 옳바른 결과를 출력하신 분 있으면 댓글 부탁드립니다.
덤으로, arpreq.arp_dev 변수를 설정해 주는 걸 생략하셨습니다
덤으로, arpreq.arp_dev 변수를 설정해 주는 걸 생략하셨습니다. ("man 7 arp"에 관련 내용이 있습니다.) 더불어, 만약을 생각해서 arpreq 변수 초기화도 시켜주신다면 더더욱 좋겠구요.
$PWD `date`
댓글 달기