[질문] 자기IP를 가져오는 방법이 알고 싶습니다.
글쓴이: pleasantman / 작성시간: 수, 2003/11/12 - 8:04오후
자기 IP를 잡아오고 싶습니다.
FTP소스에 있는 부분을 참고해서 만들어봤는데..
동작하지 않는군요..
/* ftp data connection */
ftp_fd = socket(AF_INET, SOCK_STREAM, 0);
if (ftp_fd < 0) {
perror("socket");
exit(1);
}
if (setsockopt(ftp_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0)
{
perror("setsockopt (reuse address)");
exit(1);
}
ftp_addr.sin_family = AF_INET;
ftp_addr.sin_port = htons(0); /* choose an unused port at random */
ftp_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* use my IP address */
bzero(&(ftp_addr.sin_zero), 8);
if (bind(ftp_fd, (struct sockaddr *)&ftp_addr, sizeof(ftp_addr)) < 0) {
perror("bind");
exit(1);
}
if (options & SO_DEBUG && setsockopt(ftp_fd, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
perror("setsockopt");
len = sizeof (ftp_addr);
if (getsockname(ftp_fd, (struct sockaddr *)&ftp_addr, &len) < 0) {
perror("getsockname");
exit(1);
}
if (listen(ftp_fd, 1) < 0){
perror("listen");
exit(1);
}
a = (char *)&ftp_addr.sin_addr;
p = (char *)&ftp_addr.sin_port;
#define UC(b) (((int)b)&0xff)
sprintf(PORT_temp, "PORT %d,%d,%d,%d,%d,%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1]));
//sprintf(PORT_temp, "PORT %d,%d,%d,%d,%d,%d", 10, 253, 253, 86, UC(p[0]), UC(p[1]));
PORT_temp를 프린트하면 다음과 같네요..
<PORT 0,0,0,0,4,4
보시는 데로 포트 번호는 잘 잡아 옵니다. 위의 코드는 간단한 ftp를 윈한
코드이며, 소스는 inetutils의 ftp소스를 참고 했습니다.
한가지 추가한다면.. 현재 IP가 내부 이더넷 IP와 ppp0가 있습니다..
ppp0의 IP를 가져와야 하는데.. default로 어느 값을 가져오게 되나요?
Forums:


음...
게시판 검색을 많이 하십시요. *^^*
#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( (s = ioctl(s, cmd, &ifc) ) < 0) { perror("ioctl"); exit(1); } 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( "%s IP: %s\n", ifc.ifc_ifcu.ifcu_req[i].ifr_ifrn.ifrn_name, ip ); } return ip; } int main(void) { printf("One of my IP is %s\n", myip() ); return 0; }어떤분이 예전에 올리셨던 소스입니다. 그럼...
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
[감사] 감사합니다.
검색을 한다고 했었는데..
찾지못했네요..
코드에 감사합니다. 수고하세요..
댓글 달기