외로운 Nova의 작업실

c 소켓프로그래밍 공부 - 9(ip로 도메인요청) 본문

Programming/C

c 소켓프로그래밍 공부 - 9(ip로 도메인요청)

Nova_ 2022. 3. 26. 17:59

안녕하세요. 오늘은 어제에 이어서 ip주소로 도메인이름을 출력해보도록 하겠습니다.

아래는 ip주소로 도메인이름 정보를 얻어오는 관련 함수입니다.

//아래는 ip주소로 도메인 네임을 얻어오는 함수
int getnameinfo(SOCKADDR* pAddr, socklen_t addrLen, char* nodeBuffer, WORD nodeSize, 
	char* serviceBuffer, WORD serviceSize, int flage)
//pAddr 주소에 있는 정규화된 도메인이름을 nodeBuffer에 넣고 서비스이름을 serviceBuffer에 넣음
//ms에서는 nodeSize에는 NI_MAXHOST, serviceBuffer에는 NI_MAXSERV를 넣음

하지만 요즘에는 dns서버에게 ip를 주고 도메인 네임을 얻어오는 기능 Reverse DNS 기능이 없어졌습니다.

보안상의 문자로 기능이 없어졋다고합니다.

그래서 직접 그러한지 코드를 짜보고 실행시켜보았습니다.

아래는 ip로 도메인 이름을 출력하는 코드입니다.

주소는 어제 얻어낸 "223.130.200.104" 인 네이버의 주소로 해보았습니다.

#include <stdio.h>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char* argv[]) {

	WSADATA wsaData;
	SOCKADDR* pSockAddr; //getnameinfo()함수의 첫번째 인자로 줄 sockaddr 구조체포인터
	SOCKADDR_IN sockAddrIn; //sockaddr 구조체 선언
	SOCKADDR_IN* pSockAddrIn; //sockaddr_in 구조체 포인터로 초기화후 pSockAddr로 넘겨줄것임
	char nodeBuffer[NI_MAXHOST]; // getnameinfo()함수에서 정규화된 도메인네임을 받을 버퍼
	char serviceBuffer[NI_MAXSERV]; // getnameinfo()함수에서 서비스 이름을 받을 버퍼
	int check; //getnameinfo함수가 잘 작동하는 체크하는 변수
	
	WSAStartup(MAKEWORD(2, 2), &wsaData); // 소켓 버전 맞춰줌

	memset(&sockAddrIn, 0, sizeof(sockAddrIn)); //sockAddrIn 구조체 초기화
	sockAddrIn.sin_family = AF_INET;
	sockAddrIn.sin_port = htons(80);
	
	inet_pton(AF_INET, "223.130.200.104", &(sockAddrIn.sin_addr.s_addr));

	pSockAddrIn = &sockAddrIn; //구조체 포인터값 설정
	pSockAddr = (SOCKADDR*)pSockAddrIn; //구조체 포인터 형변환값을 다시 설정

	check = getnameinfo(pSockAddr, sizeof(SOCKADDR), nodeBuffer, NI_MAXHOST, serviceBuffer, NI_MAXSERV, 0); //ip로 도메인이름 얻어옴

	if (check != 0) { //만약 작동이 안되면 에러값 표시
		printf("getnameinfo() error!");
		printf("%d", WSAGetLastError());
		exit(1);
	}

	printf("%s\n", nodeBuffer); //정식이름 출력
	printf("%s\n", serviceBuffer); //포트번호나 서비스이름 출력

	WSACleanup();
	


}

아래는 실행 화면입니다.

80번 포트번호 서비스이름인 http는 잘 출력이되지만

도메인 이름이 출력해되어야 할곳에 ip주소가 그대로 들어가있습니다.

이는 Reverse DNS 기능이 막혀서 그런것입니다.

실제로 예전에는 nslookup 프롬프트 명령어로 ip주소로 도메인이름을 알아낼 수 있었지만 지금은 실제로 해보면 안됩니다.

아래는 실제 해본사진입니다.

저기서 pcns.bora.net은 LGU+의 dns서버 이름입니다.

위 사진에서 보이는것처럼 찾을 수 없다고 계속 나옵니다.

예전엔 됫었는데 말입니다..

그래서 요즘엔 whois 홈페이지에서 ip로 dns서버 이름을 찾는 추세입니다.

https://xn--c79as89aj0e29b77z.xn--3e0b707e/

 

KISA 후이즈검색 whois.kisa.or.kr

한국인터넷진흥원 인터넷주소자원 검색(후이즈검색) 서비스 입니다.

xn--c79as89aj0e29b77z.xn--3e0b707e

위는 후이즈 검색 창이니 궁금하다면 한번 검색해보길 권해드립니다.

Comments