C에서 getaddrinfo 함수 사용
이 기사는 C에서getaddrinfo
함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.
getaddrinfo
기능을 사용하여 C의 IP 주소에 이름을 호스트합니다
getaddrinfo
는 UNIX 네트워킹 프로그래밍 기능의 일부이며 네트워크 호스트 정보를 IP 주소로 변환하거나 반대로 변환 할 수 있습니다. getaddrinfo
는 POSIX 호환 함수 호출이며 기본 프로토콜에 관계없이 변환을 수행 할 수 있습니다.
getaddrinfo
는 4 개의 인수를받습니다.
- 첫 번째는 호스트 이름 또는 IPv4 / IPv6 형식의 주소 문자열에 대한 포인터 일 수 있습니다.
- 두 번째 인수는 10 진수로 표시되는 서비스 이름 또는 포트 번호 일 수 있습니다.
- 다음 두 인수는
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
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