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 *)로 캐스트를 반드시 해주어야된다.

 

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (223)
Win32 SDK 초보 (27)
통신관련 (13)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (9)
링크 (2)
견물생심 (24)
이것저것 (7)
용어메모 (3)
데이터베이스 (21)
비주얼 베이직 (10)
하드웨어 (1)
델파이 (56)
홈페이지 (5)
낙서 (5)
기타 (4)
Total : 180,079
Today : 86 Yesterday : 73