C에서 getaddrinfo 함수 사용

Jinku Hu 2023년10월12일
  1. getaddrinfo기능을 사용하여 C의 IP 주소에 이름을 호스트합니다
  2. getnameinfo기능을 사용하여 C에서 호스트 이름에 대한 IP 주소
C에서 getaddrinfo 함수 사용

이 기사는 C에서getaddrinfo함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.

getaddrinfo기능을 사용하여 C의 IP 주소에 이름을 호스트합니다

getaddrinfo는 UNIX 네트워킹 프로그래밍 기능의 일부이며 네트워크 호스트 정보를 IP 주소로 변환하거나 반대로 변환 할 수 있습니다. getaddrinfo는 POSIX 호환 함수 호출이며 기본 프로토콜에 관계없이 변환을 수행 할 수 있습니다.

getaddrinfo는 4 개의 인수를받습니다.

  1. 첫 번째는 호스트 이름 또는 IPv4 / IPv6 형식의 주소 문자열에 대한 포인터 일 수 있습니다.
  2. 두 번째 인수는 10 진수로 표시되는 서비스 이름 또는 포트 번호 일 수 있습니다.
  3. 다음 두 인수는addrinfo구조에 대한 포인터입니다. 첫 번째는 검색된 소켓 구조를 필터링하기위한 요구 사항을 지정하는hints이고, 두 번째는 함수가addrinfo구조체의 링크 된 목록을 동적으로 할당하는 포인터입니다.

hints구조는 0으로 설정 한 다음 해당 멤버를 할당해야합니다. ai_family멤버는 주소 계열을 나타냅니다. 예를 들어 IPv4 또는 IPv6는 각각 AF_INET 및 AF_INET6으로 표시됩니다. 이 경우 서비스 이름 변환에 관심이 없으며 함수의 두 번째 인수로NULL을 지정합니다. 마지막으로getnameinfo를 호출하여 주어진sockaddr구조를 인쇄 가능한 형식으로 변환합니다.

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

int main(int argc, char const *argv[]) {
  struct addrinfo hints;
  struct addrinfo *res, *tmp;
  char host[256];

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;

  if (argc != 2) {
    fprintf(stderr, "%s string\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  int ret = getaddrinfo(argv[1], NULL, &hints, &res);
  if (ret != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
    exit(EXIT_FAILURE);
  }

  for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
    getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0,
                NI_NUMERICHOST);
    puts(host);
  }

  freeaddrinfo(res);
  exit(EXIT_SUCCESS);
}

샘플 명령 :

./program localhost

출력:

127.0.0.1
127.0.0.1
127.0.0.1

getnameinfo기능을 사용하여 C에서 호스트 이름에 대한 IP 주소

이 경우getnameinfo함수는getaddrinfo와 함께 사용되며 해당 IP 주소에 대한 호스트 이름을 검색합니다. 첫 번째 명령 줄 인수에서 사용자 입력을 처리하고이를getaddrinfo인수로 전달하여socketaddr구조체를 검색합니다. 마지막으로 각 구조는 호스트 이름 문자열로 변환 될 수 있습니다. getaddrinfo는 네 번째 인수에 연결된 목록을 저장하기 위해 동적 메모리를 할당하므로이 포인터는freeaddrinfo함수 호출로 사용자가 해제해야합니다.

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

int main(int argc, char const *argv[]) {
  struct addrinfo hints;
  struct addrinfo *res, *tmp;
  char host[256];

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;

  if (argc != 2) {
    fprintf(stderr, "%s string\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  int ret = getaddrinfo(argv[1], NULL, &hints, &res);
  if (ret != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
    exit(EXIT_FAILURE);
  }

  for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
    getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0, 0);
  }

  freeaddrinfo(res);
  exit(EXIT_SUCCESS);
}

샘플 명령:

./program 127.0.0.1

출력:

localhost
localhost
localhost
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Networking