며칠 전에 "웹 페이지를 다운로드 하기"를 올리면서, 예제로 http://checkip.dyndns.org 사이트를 방문하고, 소스를 다운 받으면 로컬이 아닌 인터넷 IP를 구할 수 있다는 말씀을 드렸습니다. 그런데, 예제 소스에서는 HTML 소스만 다운 받는 방법만 나와 있고, HTML 소스에서 IP를 구하는 부분이 없습니다. 아마도 그 부분도 궁금하셨는지 내용을 추가해 달라는 말씀이 있으셔서 예제 프로그램 소스에 그 부분을 추가하여 올립니다.

 

부탁 말씀 ^^

저에게 메일로 부탁을 주셔도 좋습니다만, 가급적 게시판에 새글이나 댓글로 올려 주시면 감사하겠습니다. 포럼인 만큼 학습 사이트라는 것을 생각하셔서 너무 어려워 하시거나 부담갖지 마시고, 대화식으로 진행했으면 하는 마음에서 부탁 말씀을 올립니다.

 

아울러 글을 올려 주시는 분께 더 왕성한 활동을 기대하면서 격려의 댓글을 올려 주시기를 부탁드립니다. ^^

 

아마도 구현을 못하셔서가 아니라, 저 같은 경우 어떻게 구현하는지 궁금하셔서 말씀 주신 것이라 생각됩니다. 제가 사용한 방법보다 더 좋거나 다른 방법이 있으시면 말씀을 부탁드립니다. ^^

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#define  BUFF_SIZE   1024

void print_internet_ip( char *data)
// 설명: 입력받은 HTML 소스에서 인터넷 IP를 구한다.
// 참고: HTML 소스에 IP 정보가 있을 때에만 화면에 IP 출력
{
    char    ip_buff[20];
    char   *paddr;
    char   *ptag;
    int     sz_ip;

    paddr = strstr( data, "<body>");                    // <body>를 먼저 검색
    if ( paddr)
    {
        paddr = strstr( paddr, "Address:");             // 검색 위치에서 다시 Address: 검색
        if ( paddr)
        {
            paddr += 9;                                 // "Address: " 길이 더하기
            ptag   = index( paddr, '<');                // </body>의 < 문자 검색
            if ( ptag)
            {
                sz_ip   = ptag -paddr;                  // IP 문자열만의 길이 구하기
                memcpy( ip_buff, paddr, sz_ip);         // IP 문자열을 버퍼에 복사
                ip_buff[sz_ip]    = '\0';               // IP 문자열 뒤에 NULL 대입
                printf( "internet ip= [%s]\n", ip_buff);
            }
        }
    }
}

int   main( int argc, char **argv)
{
    int                         hsocket;
    struct      sockaddr_in     server_addr;
    struct      hostent        *host_entry;
    char                       *p_enter= "\r\n";
    char                       *p_get= "GET / HTTP/1.1\r\n User-Agent: Mozilla/4.0\r\n \
                                        content-type:text/html\r\n \
                                        Connection: close\r\n\r\n";
    char                        buff[BUFF_SIZE+1];

    host_entry = gethostbyname( "checkip.dyndns.org");

    if ( !host_entry)
    {
        printf( "gethostbyname() 실행 실패/n");
        exit( 1);
    }

    hsocket = socket( PF_INET, SOCK_STREAM, 0);
    if( -1 == hsocket)
    {
        printf( "socket 생성 실패\n");
        exit( 1);
    }
    memset( &server_addr, 0, sizeof( server_addr));
    server_addr.sin_family     = AF_INET;
    server_addr.sin_port       = htons( 80);
    memcpy((void *)(&server_addr.sin_addr), (void *)(host_entry->h_addr),
                sizeof(server_addr.sin_addr));

    if( -1 == connect( hsocket, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
    {
       printf( "접속 실패n");
    }
    else
    {
        memset( buff, '\0', BUFF_SIZE+1);
        send( hsocket, p_get, strlen( p_get)+1, 0);
        if ( 0 == read( hsocket, buff, BUFF_SIZE))
        {
            printf( "웹 소스 구하기 실패\n");
        }
        else
        {
            print_internet_ip( buff);
        }
        close( hsocket);
    }
    return 0;
}

실행하시면 아래와 같이 출력됩니다.

]$ gcc globalipaddress.c 
]$ ./a.out               
internet ip= [218.55.127.122]
]$