프로그래밍 노트

[winsock 초보 프로그래밍] 10 호스트명에서 IP 어드레스 얻기 본문

통신관련

[winsock 초보 프로그래밍] 10 호스트명에서 IP 어드레스 얻기

띠리 2007. 5. 9. 12:41


inet_addr()을 이용하여 "127.0.0.1"라는 문자열을 32비트의 바이너리 값으로 변환한다.
inet_addr()는 IP 어드레스를 나타내는 문자열을 바이너리 값으로 변환하는 함수이다.

통신하기위해 상대방을 지정할 때는 "127.0.0.1"과 같은 IP 어드레스를 쳐넣지만
"localhost"와 같이 이름을 이용하여 통신할 상대방을 지정할 수도 있다.

이와 같이 호스트의 이름으에서 IP 어드레스로 변환해 주는 함수가 gethostbyname()이다.

#include <stdio.h>
#include <winsock2.h>

int main()

{

    WSADATA    wsaData;

    SOCKET    sockClt;

    char    szMsg[32];

    char    pszName[32];


    struct sockaddr_in addrSockSvr;


    printf("IP 어드레스나 호스트명을 쓰3: ");

    gets(pszName);


    // 윈속 초기화

    if(WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)

    {

        printf("WSAStartup Error No : %d", WSAGetLastError());

        return 1;

    }


    // 소켓 만들기

    sockClt = socket(AF_INET, SOCK_STREAM, 0);

    if(sockClt == INVALID_SOCKET)

    {

        printf("Socket Error No : %d", WSAGetLastError());

    }


    // 접속할 서버 설정

    addrSockSvr.sin_family = AF_INET;

    addrSockSvr.sin_port = htons(333);

    addrSockSvr.sin_addr.S_un.S_addr = inet_addr(pszName);


    // 호스트명을 입력했을때

    if(addrSockSvr.sin_addr.S_un.S_addr == 0xffffffff)

    {

        struct hostent *psthost;


        psthost = gethostbyname(pszName);

        if(psthost == NULL)

            return 1;


        addrSockSvr.sin_addr.S_un.S_addr = *(unsigned int *)psthost->h_addr_list[0];

    }


    // 서버에 접속

    if(connect(sockClt, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr)) != 0)

    {

        printf("connect Error No : %d", WSAGetLastError());

        return 1;

    }


    // 서버로 부터 데이터 수신

    memset(szMsg, 0, sizeof(szMsg));

    int nLet = recv(sockClt, szMsg, sizeof(szMsg), 0);


    printf("%s\n", szMsg);


    // 윈속 종료

    WSACleanup();


    return 0;

}


addrSockSvr.sin_addr.S_un.S_addr = *(unsigned int *)psthost->h_addr_list[0];
위의 캐스트는 잊지 말아야된다.
h_addr_list[0]은 char*임으로 *h_addr_list[0]은 8비트의 값이 된다.
IP 어드레스의 모든 주소를 얻기 위해서는 (unsigned int *)로 캐스트를 반드시 해주어야된다.

 

Comments