본문 바로가기

Programming Language/C&C++

소켓 함수를 사용하여 도메인을 IP주소간 상호 변환하기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

getnameinfo는 IP 주소에서 도메인으로 변환하는 기능을, getaddrinfo는 도메인에서 IP 주소로 변환하는 기능을 제공합니다.

최근의 DNS 서버는 IP 주소에서 도메인으로 변환하는 Reverse DNS 기능을 지원하지 않기 때문에 getnameinfo 함수의 결과가 올바르지 않을 수 있습니다.

/* 예제 */
/* WinSock 라이브러리를 링크합니다. */
#pragma comment(lib, "ws2_32.lib")

/* 소켓 구조체를 사용하기 위한 헤더 */
#include 
/* getnameinfo와 getaddrinfo가 선언된 헤더 */
#include 

#include 
#include 
#include 
int main(int argc, char * argv[])
{
	ADDRINFO addrInfo;
	ADDRINFO * pAddrInfo;
	SOCKADDR_IN sockAddr;
	SOCKADDR_IN * pSockAddr;
	CHAR szAddress[512];
	WSADATA wsaData;
	CHAR szBuffer1[512], szBuffer2[512];

	WSAStartup(MAKEWORD(1, 1), &wsaData);
	
	/* 도메인을 IP 주소로 변환합니다. 접속 조건인 addrinfo 구조체, IP 주소가 반환될 addrinfo * 포인터가 사용됩니다. */ 
	ZeroMemory(&addrInfo, sizeof(addrInfo));
	addrInfo.ai_family = AF_UNSPEC;
	addrInfo.ai_socktype = SOCK_STREAM;
	addrInfo.ai_protocol = IPPROTO_TCP;

	getaddrinfo("www.naver.com", "0", &addrInfo, &pAddrInfo);
	pSockAddr = (SOCKADDR_IN *)pAddrInfo->ai_addr;
	printf("IP address is %s\n", inet_ntoa(pSockAddr->sin_addr));
	freeaddrinfo(pAddrInfo);

	/* IP 주소를 도메인으로 변환합니다. IP 주소를 담고 있는 sockaddr_in * 구조체, 도메인이 반환될 char * 배열, 서비스가 반환될 char * 배열이 사용됩니다. */
	strcpy(szAddress, "173.194.127.53");
	ZeroMemory(&sockAddr, sizeof(sockAddr));
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_addr.s_addr = inet_addr(szAddress);
	sockAddr.sin_port = 80;

	ZeroMemory(szBuffer1, sizeof(szBuffer1));
	ZeroMemory(szBuffer2, sizeof(szBuffer2));
	getnameinfo((const SOCKADDR *)&sockAddr, sizeof(sockAddr), szBuffer1, sizeof(szBuffer1), szBuffer1, sizeof(szBuffer1), NI_NUMERICSERV);

	printf("Node Name is %s Service is %s", szBuffer1, szBuffer2);

	WSACleanup();
}