728x90

문자열 정보를 네트워크 바이트 순서의 정수로 변환

- sockaddr_in 구조체에 ip와 port 정보를 담음

- 이 정보를 담는 과정에서 네트워크 바이트 순서를 맞춰줘야 함

- inet_addr : 문자열 IP 정보를 네트워크 바이트 오더 정수로 변환

int main(int argc, char *argv[])
{
    WSADATA	wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) {
        printf("WSAStartup() error!");
    }

    char *addr="127.0.0.1";
    unsigned long conv_addr=inet_addr(addr);
    if(conv_addr==INADDR_NONE) {
        printf("Error occured! \n");
    }
    else {
        printf("네트워크 바이트 오더 정수 : %#lx \n", conv_addr);
    }

    WSACleanup();
    return 0;
}

    -> 잘못된 IP를 전달할 경우 INADDR_NONE 상수 반환

    char *addr="127.0.0.256";
    unsigned long conv_addr=inet_addr(addr);

- inet_aton : inet_addr과 같은 기능을 가지지만 결과를 받는 방법에 차이가 있음

    -> inet_addr : 변환 결과를 반환값으로 받음

    -> inet_aton : sockaddr_in의 멤버인 in_addr을 인자로 전달

int main(int argc, char *argv[])
{
    char *addr="127.0.0.1";
    struct sockaddr_in addr_inet;

    if(!inet_aton(addr, &addr_inet.sin_addr)) {
        printf("Error occured! \n");
    }
    else {
        printf("Network ordered integer addr: %#x \n", addr_inet.sin_addr.s_addr);
    }

    return 0;
}

- inet_ntoa : sockaddr_in의 sin.addr에 저장된 정수형 ip정보를 문자형으로 변환

int main(int argc, char *argv[])
{
    WSADATA	wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) {
        printf("WSAStartup() error!");
    }

    struct sockaddr_in addr;
    char* str_arr;
    addr.sin_addr.s_addr = htonl(0x1020304);

    str_arr=inet_ntoa(addr.sin_addr);
    printf("IP address = %s\n",str_arr);

    WSACleanup();
    return 0;
}

인터넷 주소의 초기화

- 전에 설명한 htons 함수와 inet_addr 함수를 이용해 sockaddr_in 구조체에 ip 정보와 포트 정보를 설정 후 bind로 전달

int main(int argc, char *argv[])
{
	...
    struct sockaddr_in addr;
    
    char* serv_ip = "127.0.0.1";
    char* serv_port = "8080";
    
    memset(&addr, 0, sizeof(addr);
    addr.sin_family=AF_INET;
    addr.sin_addr.s_addr=htonl(serv_ip);
    addr.sin_port=htons(atoi(serv_port));		
    
    bind(serv_sock, (struct sockaddr*)&addr, sizeof(addr);
    ...
}

 

윈도우 기반의 변환 함수

- WASStringToAddress : 문자열 ip주소와 포트번호를 전달하여 SOCKADDR 구조체에 설정

- WASAddressToString : SOCKADDR 구조체에 저장된 ip와 포트 정보를 문자열로 반환

int main(int argc, char *argv[])
{
    char *strAddr="127.0.0.1:8080";

    char strAddrBuf[50];
    SOCKADDR_IN servAddr;
    memset(strAddrBuf,0,sizeof(strAddrBuf));
    memset(&servAddr,0,sizeof(servAddr));
    int size = 0;

    WSADATA	wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    size=sizeof(servAddr);
    WSAStringToAddress(strAddr, AF_INET, NULL, (SOCKADDR*)&servAddr, &size);

    size=sizeof(strAddrBuf);
    WSAAddressToString((SOCKADDR*)&servAddr, sizeof(servAddr), NULL, strAddrBuf, &size);

    printf("변환 결과 : %s \n", strAddrBuf);
}

728x90

+ Recent posts