호스트,네트워크간 변환 함수 정리
System Program/socket 2014. 3. 4. 10:42호스트는 네트워크 상에 연결된 단말기를 말한다.
호스트에서 작업한 내용을 네트워크로 소켓 API로 전송 시 이종 시스템간 및 네트워크 특성을
반영하여 변환이 필요하다. 이 때 사용되는 함수들을 정리한다.
1. 호스트와 네트워크 바이트 순서 변경 함수
호스트는 빅엔디안/리틀엔디안 시스템에 따라 둘 중 하나를 사용할 수 있다.
하지만 네트워크 전송 시에는 네트워크 바이트 순서로 바꾸어 주어야 한다.
네트워크는 빅엔디안을 사용한다. 이들 바이트 순서간의 상호 변환하는 함수를 기술한다.
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과 같은 형식이다.
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만을 지원하는
한계로 사용하지 않는 것이 좋다.
int inet_aton(const char *str, struct in_addr *addr);
str이 유효한 점으로 구분하는 십진수 주소이면 '1'을 리턴, 에러가 발생하면 '0'을 리턴
char *inet_ntoa(struct in_addr addr);
addr을 점으로 구분하는 십진수 문자열로 변환한 결과를 가르키는 포인터값을 리턴한다.
'System Program > socket' 카테고리의 다른 글
IP주소 및 포트 정보관련 시스템 함수 (0) | 2014.03.04 |
---|---|
IP주소 및 포트 관리 (0) | 2014.03.04 |
주소 구조체 (0) | 2014.03.04 |
기본 소켓시스템 함수 (비연결형) (0) | 2014.03.03 |
기본 소켓 시스템 함수 (연결형) (0) | 2014.03.03 |