티스토리 뷰

반응형

통신용 프로그램 또는 로그 기록을 위하여 도메인을 IP로 변환하는 경우가 있습니다.

서버 도메인을 사용하여 접속하는 경우에 IP값을 알고 싶은 경우도 있습니다.

 

여기 저기 정보들을 정리하여, 실제 동작되는 함수를 만들어 보았습니다.

제 PC에서는 잘 동작이 되는 것을 확인하였지만,

동작이 안된다거나 보완이 필요한 부분은 댓을 남겨주시면 고맙습니다.

 


[ 필수 Uses 절 ]

Winapi.winsock

 

[ 함수 정의 ] 도메인을 상수로 전달받아 문자열로 반환한다.

function GetIPAddressFromDomainName(Host: PAnsiChar): String;

[ 함수 본문 ] 도메인 주소를 전달받아 함수값으로 IP를 반환한다.

//
//  도메인으로 IP 반환
//
function GetIPAddressFromDomainName(Host: PAnsiChar): String;
var
  WSAData1: WSADATA;
  HostEnt: PHostEnt;
  pAddr: PAnsiChar;
  addr: in_addr;
begin
  Result:='';

  // GetHostByName 을 쓰기 위해 WSAStartup 을 한번 해줘야 함
  if WSAStartup(MAKEWORD(2, 2), WSAData1)<>0 then Exit;

  // WSAStartup 호출이 제대로 되지 않음을 체크(?)
  if (LOBYTE(WSAData1.wVersion)<>2) or (HIBYTE(WSAData1.wVersion)<>2) then begin
    WSACleanup;
    Exit;
  end;

  // HostEnt 로 매개변수로 받아온 도메인이름의 정보를 받아옴
  HostEnt := GetHostByName(Host);
  if HostEnt=nil then Exit;

  // PChar 형 변수로 ip 주소를 옮김
  pAddr := HostEnt^.h_addr_list^;
  if pAddr=nil then Exit;

  // 옮긴 ip 주소를 in_addr 로 적절히 변환
  addr.S_un_b.s_b1 := pAddr[0];
  addr.S_un_b.s_b2 := pAddr[1];
  addr.S_un_b.s_b3 := pAddr[2];
  addr.S_un_b.s_b4 := pAddr[3];

  // 변환된 ip 주소를 반환
  Result := inet_ntoa(addr);
end;
반응형
댓글