IP 주소 변환

이동욱

2021/08/01

Categories: 네트워크

주소 변환


아래는 주소를 변환할 수 있는 API 이다.

함수 설명
int inet_addr(const char *cp) cp 문자열 IP 주소를 네트워크 바이트 순서 in_addr_t로 반환
int inet_network(const char *cp) cp 문자열 IP 주소를 호스트 바이트 순서 in_addr_t로 반환
int inet_aton(const char *cp, strcut in_addr *inp) cp 문자열 IP 네트워크 바이트 순서 inp로 변환
char *inet_ntoa(struct in_addr in); 네트워크 바이트 순서로 된 in_addr구조체 주소에서 IP 주소 문자열 반환
int inet_pton(int af, const char *src, void *dst); af 인자로 3계층 프로토콜 선택 가능, src 문자열 주소를 dst로 변환
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); af 인자로 3계층 프로토콜을 선택 가능, src 주소 구조체를 문자열 주소로 변환

IP 주소를 정수로 변환하여 출력하는 예제


#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>

int main(int argc, char** argv) {
  uint32_t ip_int;
  char *ip_str = "127.0.0.1";

  ip_int = inet_network(ip_str);

  printf("string: %s, decimal: %u, hex: %x\n",
    ip_str, ip_int, ip_int);

  ip_int = htonl(ip_int);
  printf("after htonl - decimal: %u, hex: %x \n",
    ip_int, ip_int);

  return 0;
}

주소 변환 함수 예제


#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int print_addr(struct sockaddr_in *);

int main(char argc, char* argv[]) {

  char *sample_ip = "127.0.0.1";

  int port = 9002;

  struct sockaddr_in sock_addr1, sock_addr2, sock_addr3;

  sock_addr1.sin_family = AF_INET;
  sock_addr1.sin_addr.s_addr = inet_addr(sample_ip);
  sock_addr1.sin_port = htons(port);

  sock_addr2.sin_family = AF_INET;
  inet_aton(sample_ip, &(sock_addr2.sin_addr));
  sock_addr2.sin_port = htons(port);

  sock_addr2.sin_family = AF_INET;
  inet_aton(sample_ip, &(sock_addr2.sin_addr));
  sock_addr2.sin_port = htons(port);

  sock_addr3.sin_family = AF_INET;
  inet_pton(AF_INET, sample_ip, &(sock_addr3.sin_addr));
  sock_addr3.sin_port = htons(port);

  print_addr(&sock_addr1);
  print_addr(&sock_addr2);
  print_addr(&sock_addr3);

  printf("===== ntoa =====\n");
  printf("IP: %s \n", inet_ntoa(sock_addr1.sin_addr));
  printf("IP: %s \n", inet_ntoa(sock_addr2.sin_addr));
  printf("IP: %s \n", inet_ntoa(sock_addr3.sin_addr));
  return 0;
}

int print_addr(struct sockaddr_in *address) {
  int port;
  char txt[INET_ADDRSTRLEN];
  port = ntohs(address->sin_port);
  inet_ntop(AF_INET, &(((struct sockaddr_in *) address) -> sin_addr), txt, sizeof(struct sockaddr_in));
  printf("ip: %s, port: %d \n", txt, address->sin_port);
  return 0;
}

호스트 이름과 IP 주소


#include <netdb.h>
#include <sys/socket.h>
struct hosten *gethostbyname(const char *name);
struct hostent {
  char *h_name; // 호스트의 공식 이름
  char **h_aliases; // 가명 리스트 (마지막 인자는 NULL)
  int h_addrtype; // 호스트 주소 타입 (IPv4, IPv6)
  int h_length; // 주소의 길이
  char **h_addr_list; // 주소 리스트 (마지막 인자는 NULL)
}
#define h_addr h_addr_list[0]; // 주소 중 첫 번째 엔트리

호스트 이름으로 IP 주소를 조회하는 예제


#include <stdio.h>
#include <netdb.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>

void err_proc(const char *);

int main(int argc, char *argv[]) {
  struct hostent *ent;
  struct in_addr **res;
  int i = 0;

  if (argc != 2) {
    fprintf(stderr, "usage: %s <hostname> \n", argv[0]);
    return -1;
  }

  ent = gethostbyname(argv[1]);
  if (ent == NULL) err_proc("gethostbyname");

  res = (struct in_addr **) ent->h_addr_list;
  printf("hostname: %s \n", ent->h_name);
  while(res[i] != NULL) {
    printf("%s", inet_ntoa(*res[i]));
    i++;
  }
  printf("\n");
}

void err_proc(const char *str) {
  fprintf(stderr, "%s: %s\n", str, strerror(errno));
  exit(errno);
}

참고 문헌


>> Home