안녕하세요.
프로그램에서 게이트웨이 IP를 알아내는 방법을 찾고 있습니다. 자기 IP와 넷마스크는 ioctl()를 이용해서 알아낼 수 있는데, 게이트웨이 IP는 어떻게 알아내는지....
ioctl()로는 안되는 것 같고, /proc/net/route 파일을 보니 라우팅정보가 있더군요. 이걸 읽어 게이트웨이를 추출해야 하나.....
조언 부탁드립니다.
자신의 IP와 NM값 어떻게 알아내셨나요~?
공유 좀~ 해주세요.
_____________________________ 언제나 맑고픈 샘이가...http://purewell.biz
자신의 IP와 NM값 어떻게 알아내셨나요~? 공유 좀~ 해주세요.
보통은 gethostbyname을 이용하라고 나온 자료가 많은데, 그것 보다는 ioctl()을 이용하는 것이 좋은 것 같습니다. 소스 올립니다.
int get_ipconfig(uint *ipaddr, uint *netmask) { int i, sock, ret; struct ifreq ifr; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock < 0) { printf("socket() error\n"); return -1; } strcpy(ifr.ifr_name, "eth0"); // Get IP Adress ret = ioctl(sock, SIOCGIFADDR, &ifr); if (ret < 0) { printf("get_ipconfig(), ioctl() error\n"); close(sock); return -1; } *ipaddr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; // Get Netmask ret = ioctl(sock, SIOCGIFNETMASK, &ifr); if (ret < 0) { printf("get_ipconfig(), ioctl() error\n"); close(sock); return -1; } *netmask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; close(sock); }
/usr/include/sockios.h 파일을 보시면 ioctl() 옵션이 모두 나와있습니다.
비슷한 코드인데, 이것은 network interface 카드를 뒤져가며, 모두 돌려주는 것입니다. HP에서는 잘 안되는 경향이 있어서 살펴보니, Address family가 internet이 아닌것도 나오더군요.. AF_INET 인것만 추출하도록 하였습니다.
제가 테스트한것은 gcc 로 하였고
linux, solaris 2.5.1, aix 4.3, hpux10.x 입니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stropts.h> #if defined(sun) #include <sys/sockio.h> #endif #include <net/if.h> #if defined(linux) #include <linux/sockios.h> #endif #define BUFFERSIZE 1024 const char * localip = "0.0.0.0"; const char * myip() { const int MAX_NIC = 10; struct ifconf ifc; struct ifreq ifr[MAX_NIC]; int s; int nNumIFs; int i; int count; int max=2; static char ip[BUFFERSIZE]; int cmd = SIOCGIFCONF; max++; ifc.ifc_len = sizeof ifr; ifc.ifc_ifcu.ifcu_req = ifr; if( (s=socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); exit(1); } #if defined(_AIX) cmd = CSIOCGIFCONF; #endif if( ioctl(s, cmd, &ifc) < 0) { perror("ioctl"); exit(1); } close(s); nNumIFs = ifc.ifc_len / sizeof ( struct ifreq ); count = 0; strcpy( ip, localip ); for( i=0; i<nNumIFs; i++ ) { struct in_addr addr; if( ifc.ifc_ifcu.ifcu_req[i].ifr_ifru.ifru_addr.sa_family != AF_INET) { continue; } addr = ((struct sockaddr_in *) & ifc.ifc_ifcu.ifcu_req[i].ifr_ifru.ifru_addr)->sin_addr; if( addr.s_addr == htonl( 0x7f000001 ) ) { continue; } strcpy( ip, inet_ntoa( addr ) ); printf( "IP: %s\n", ip ); } return ip; } int main() { printf("One of my IP is %s\n", myip() ); return 0; }
--
2년만에 resource leak 부분을 수정하여 올립니다.http://bbs.kldp.org/viewtopic.php?t=50279 여기를 참고하세요 :)
---http://coolengineer.com
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
[샘] 답변은 아니고...
자신의 IP와 NM값 어떻게 알아내셨나요~?
공유 좀~ 해주세요.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
Re: [샘] 답변은 아니고...
보통은 gethostbyname을 이용하라고 나온 자료가 많은데,
그것 보다는 ioctl()을 이용하는 것이 좋은 것 같습니다.
소스 올립니다.
/usr/include/sockios.h 파일을 보시면
ioctl() 옵션이 모두 나와있습니다.
Re: [샘] 답변은 아니고...
비슷한 코드인데, 이것은 network interface 카드를 뒤져가며, 모두 돌려주는 것입니다. HP에서는 잘 안되는 경향이 있어서 살펴보니, Address family가 internet이 아닌것도
나오더군요.. AF_INET 인것만 추출하도록 하였습니다.
제가 테스트한것은 gcc 로 하였고
linux, solaris 2.5.1, aix 4.3, hpux10.x 입니다.
--
2년만에 resource leak 부분을 수정하여 올립니다.
http://bbs.kldp.org/viewtopic.php?t=50279
여기를 참고하세요 :)
---
http://coolengineer.com
댓글 달기