PointToPoint(ADSL) 에서는 자신의 IP와 반향되는 IP가 있는데 이 반향되는 IP를 얻으려면 SIOCGIFDSTADDR 을 사용하세요. 또한 IIf 가 DOWN되었을때 (IP가 없을때) 위의 방법으로는 해당 IP가 검출이 안될것으로 보입니다. 그래서 제가 고안한 방법은 /proc/net/route와 /proc/net/dev 를 종합 검색하는 부분이 필요할것으로 판단하고 있습니다. 혹시 다른 분들은 어떻게 생각하고 있을까요? [minzkn]
음.. IIF가 다운되었을 경우는.. 생각하지 않아도 관계없을것 같다는 생각이.. ifconfig 같은 경우에도 IIF가 다운되어 있을 경우에는 정보를 출력하지 않으니.. SIOCGIFDSTADDR의 사용은 좋은 정보군요.. 한번 테스트 해봐야 겠네요. 아 확실히 하려면 /proc/net/route 등의 정보를 활용하는 것도 좋겠군요. [yundream]
설명
사용방법
코드
#include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <net/if.h> #include <arpa/inet.h> typedef struct _ifinfo { struct sockaddr_in *sin; char ifname[40]; int fd; struct ifreq *ifr; struct ifconf ifcfg; int ifnum; } IF; IF *ifopen(); IF *ifget(IF *); int ifclose(IF *); IF *ifopen() { struct sockaddr_in *sin; int numreqs = 30; IF *LIF; LIF = (IF *)malloc(sizeof(&LIF)); memset((void *)LIF, 0x00,sizeof(&LIF)); LIF->fd = socket(AF_INET, SOCK_DGRAM, 0); memset(&ifcfg, 0, sizeof(ifcfg)); ifcfg.ifc_buf = NULL; ifcfg.ifc_len = sizeof(struct ifreq) * numreqs; ifcfg.ifc_buf = malloc(ifcfg.ifc_len); ifcfg.ifc_len = sizeof(struct ifreq) * numreqs; ifcfg.ifc_buf = realloc(ifcfg.ifc_buf, ifcfg.ifc_len); if (ioctl(LIF->fd, SIOCGIFCONF, (char *)&ifcfg) < 0) { perror("SIOCGIFCONF "); return (IF *)NULL; } //printf("%d : %d \n", ifcfg.ifc_len, sizeof(struct ifreq)); LIF->ifr = ifcfg.ifc_req; return LIF; } IF *ifget(IF *AIF) { if (AIF->ifnum > 0) { AIF->ifr++; } if (AIF->ifnum < AIF->ifr.ifc_len) { AIF->ifnum += sizeof(struct ifreq); strncpy(AIF->ifname, AIF->ifr->ifr_name, 40); AIF->sin = (struct sockaddr_in *)&AIF->ifr->ifr_addr; return AIF->ifr; } else return (IF *)NULL; /* for (n = 0; n < ifcfg.ifc_len; n+= sizeof(struct ifreq)) { printf("%s\n", ifr->ifr_name); sin = (struct sockaddr_in *)&ifr->ifr_addr; printf("IP %s\n", inet_ntoa(sin->sin_addr) ); if ( (sin->sin_addr.s_addr) == INADDR_LOOPBACK) { printf("Loop Back\n"); } ioctl(fd, SIOCGIFBRDADDR, (char *)ifr); sin = (struct sockaddr_in *)&ifr->ifr_broadaddr; printf("BROD %s\n", inet_ntoa(sin->sin_addr)); ioctl(fd, SIOCGIFNETMASK, (char *)ifr); sin = (struct sockaddr_in *)&ifr->ifr_addr; printf("MASK %s\n", inet_ntoa(sin->sin_addr)); ioctl(fd, SIOCGIFMTU, (char *)ifr); printf("MTU %d\n", ifr->ifr_mtu); ioctl(fd, SIOCGIFINDEX, (char *)ifr); printf("BAND %d %d\n", ifr->ifr_ifindex, ifr->ifr_bandwidth); printf("\n"); ifr++; } */ } int infget(IF *AIF) { close(AIF->fd); free(AIF); } int main() { IF *ifp; ifp = ifopen(); if (ifp == NULL) { perror("error "); } while((ifp = ifget(ifp)) != NULL) { printf("GET GET\n"); } }변경사항
2004/01/08
낙서
Recent Posts
Archive Posts
Tags