커널의 arp테이블과 라우팅 테이블을 참조 하기위한 ioctl사용법
글쓴이: yhlvyp / 작성시간: 일, 2005/06/19 - 7:33오후
라우팅 프로토콜을 짜고있습니다.
커널과 연동이 되기 위해 arp테이블과 라우팅 테이블을 참조 하기위해 ioctl을 이용하려 합니다.
우선 arp테이블을 초기화 하기 위해 arp테이블을 지우는 ioctl명령을 아래와 같이 했습니다.
sockfd = socket( AF_INET, SOCK_DGRAM, 0 ); memset(&ld->ifr, 0, sizeof(ld->ifr)); strcpy( ld->ifr.ifr_name, device ); struct sockaddr_in *sin = (void *) &ld->ifr.ifr_ifru.ifru_addr; sin->sin_family = AF_INET; sin->sin_addr.s_addr = ld->gen_addr; sin->sin_port = 0; if( ioctl(sockfd, SIOCDARP, &ld->ifr )<0 ) { ERR("delete arp table ioctl(SIOCDARP)"); }
결과는 Protocol family not supported라는 에러 메시지가 뜹니다.
이와 같은 명령어들을 수행하기 위해 ioctl함수의 첫번째와 세번째 인자가
어떤 의미를 가지며 어떻게 써야하는지를 알고 싶습니다.
그리고 이명령어 외에
/* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ #define SIOCDARP 0x8953 /* delete ARP table entry */ #define SIOCGARP 0x8954 /* get ARP table entry */ #define /* Routing table calls. */ #define SIOCADDRT 0x890B /* add routing table entry */ #define SIOCDELRT 0x890C /* delete routing table entry */ #define SIOCRTMSG 0x890D /* call to routing system */ SIOCSARP 0x8955 /* set ARP table entry */
등의 명령어들이 있는데 이중 get ARP table entry같은 경우는
어떻게 참조가 가능한지 알고싶습니다. ifr구조체에 관련 포인터 변수는 없는듯 한데..
call to routing system도 무슨의미인지 모르겐네요=_=
고수님들의 답변 부탁드립니다.
Forums:
SIOCGARP, SIOCDARP 의 경우 /usr/include
SIOCGARP, SIOCDARP 의 경우
/usr/include/linux/if_arp.h 에 선언되어 있는
struct arpreq 형 자료를 사용합니다.
struct ifreq 형의 자료를 사용하시면 안됩니다.
Protocol family not supported 에러는
커널 코드에 보면 ...
이렇게 되어 있더군요.
ifreq 말고 arpreq 형으로 넣어서 해보시지요.
^^*
여전히 안되네요ㅜㅜ
아래와 같이 했는데 여전히 같은 에러입니다.; 어떻게 해야할까요?
::peha::
struct arpreq를 초기화시켜 주시고 필요한 값들을 넣어야 합니다
struct arpreq를 초기화시켜 주시고 필요한 값들을 넣어야 합니다.
^^*
댓글 달기