호스트,네트워크간 변환 함수 정리

System Program/socket 2014. 3. 4. 10:42

호스트는 네트워크 상에 연결된 단말기를 말한다.

호스트에서 작업한 내용을 네트워크로 소켓 API로 전송 시 이종 시스템간 및 네트워크 특성을

반영하여 변환이 필요하다. 이 때 사용되는 함수들을 정리한다.

 

1. 호스트와 네트워크 바이트 순서 변경 함수

 

호스트는 빅엔디안/리틀엔디안 시스템에 따라 둘 중 하나를 사용할 수 있다.

하지만 네트워크 전송 시에는 네트워크 바이트 순서로 바꾸어 주어야 한다.

네트워크는 빅엔디안을 사용한다. 이들 바이트 순서간의 상호 변환하는 함수를 기술한다.

 

#include <arp/inet.h>

uint16_t htons(uint16_t host_uint16);

host_uint16을 네트워크 바이트 순서로 변환한 값을 리턴

uint32_t htonl(uint32_t host_uint32);

host_uint32을 네트워크 바이트 순서로 변환한 값을 리턴

uint16_t ntohs(uint16_t net_uint16);

net_uint16을 호스트 바이트 순서로 변환한 값을 리턴

uint32_t ntohl(uint32_t net_uint32);

net_uint32을 호스트 바이트 순서로 변환한 값을 리턴

 

네트워크 프로그램 시에는 바이트 순서가 호스트와 네크워크간에 일치하더라도 항상 위의 함수로 변환하는

습관을 가져야 이식성을 높일 수 있다.

 

2. 호스트와 서비스 변환 함수

 

컴퓨터 내부에서 IP 주소와 포트 번호는 이진 형식으로 표현한다.

사람이 친숙한 포멧과 기계가 알아먹을 수 있는 포멧간의 상호 변환 함수이다.

일반적인 사람이 사용하는 IP 포멧은 127.0.0.1과 같은 형식이다.

 

#include <arp/inet.h>

int inet_pton(int domain, const char *src_str, void *addrptr);

src_str이 프리젠테이션 포멧이 아닌 경우에는 '0'을, 에러가 발생하면 '-1'을 리턴, 변환 성공하면 '1'을 리턴

const char *inet_ntop(int domain, const void *addrptr, char *dst_str, size_t len);

성공하면 dst_str의 포인터를 리턴, 에러가 발생하면 NULL을 리턴 

 

[예제]

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
	struct sockaddr_in sa;
	char buffer[INET_ADDRSTRLEN] = {0};
	
	if(argc < 2)
	{
		printf("not enough parameter [usage]: %s 'ip address' ", argv[0]);
		exit(EXIT_FAILURE);
	}	
	
	inet_pton(AF_INET, argv[1], &(sa.sin_addr));
	
	if(inet_ntop(AF_INET, &(sa.sin_addr), buffer, INET_ADDRSTRLEN) == NULL)
	{
		perror("inet");
		exit(EXIT_FAILURE);
	}
	
	printf("%s\n", buffer);
	
	exit(EXIT_SUCCESS);
}


 

위의 함수는 IPv6까지 지원하는 함수이다. 과거에는 아래의 함수를 많이 사용하였으나 IPv4만을 지원하는

한계로 사용하지 않는 것이 좋다.

 

#include <arp/inet.h>

int inet_aton(const char *str, struct in_addr *addr);

str이 유효한 점으로 구분하는 십진수 주소이면 '1'을 리턴, 에러가 발생하면 '0'을 리턴

char *inet_ntoa(struct in_addr addr);

addr을 점으로 구분하는 십진수 문자열로 변환한 결과를 가르키는 포인터값을 리턴한다.   

 

 

 

 

 

: