본문 바로가기
삽질/델파이

아이피 구하기

by rokwha 2025. 3. 24.

델파이에서 아이피를 구해보자.

공인아이피는 현재로서는 외부서버에 도움을 받는 방법 밖에 없는것 같다. 젤 간단한 방법이자 유일한 방법이 아닐까? 싶기도 하다.

http://ip.delphi.or.kr/

 

http://ip.delphi.or.kr/

 

ip.delphi.or.kr

 

링크를 클릭해보면 아이피 가 딸랑 하나 나오는데 그게 현재 내컴퓨터가 사용하는 공인(외부) 아이피이다. 

네이버나 다음검색창에 공인ip 라고 검색해도 젤 상단에 표시해준다. 

그외 https://ip.pe.kr , http://www.findip.kr , http://www.ipconfig.kr 과 같은 수많은 사이트나 api 를 제공해 주는 곳이 많다.

 

IP 정보 조회 - ipconfig.kr

IP 정보 조회 IP 주소27.0.238.118 IP 범위27.0.236.0 - 27.0.239.255 국가 코드KR 국가 이름South Korea ISPAS38099 Kakao Corp 도메인kakao.com 국기 수도Seoul 인구51,780,579 면적100,210 km² 통화KRW 언어Korean 좌표37, 127.5 러시

www.ipconfig.kr

 

맘에 드는 곳을 골라서 idHttp 나 WinHttp 같은걸로 접속해서 결과를 가져다 파싱해서 쓰면 되겟다.

 

로컬(사설) 아이피 의 경우는 여러가지 방법이 있겟지만 보통 윈도우가 제공하는 api 를 쓰면 된다.

 

제일 고전적이면서 간단한 방법부터 알아보도록 하자. 

 

gethostbyname

https://learn.microsoft.com/ko-kr/windows/win32/api/winsock2/nf-winsock2-gethostbyname

 

gethostbyname 함수(winsock2.h) - Win32 apps

gethostbyname 함수(winsock2.h) 함수는 호스트 데이터베이스에서 호스트 이름에 해당하는 호스트 정보를 검색합니다.

learn.microsoft.com

 

gethostbyname 은 이름에서 보듯이 이름으로 정보를 조회하는데 getaddrinfo 함수를 사용하도록 권고가 되어져 있지만 아직도 간단하게 사용하기엔 무리가 없다.

 

근데 이 함수는 호스트명 을 던져줘야 하니깐 우선 호스트명 ( 여기서는 로컬 컴퓨터의 이름) 을 구해야 한다.

 

gethostname 이라는 api 가 있다.

https://learn.microsoft.com/ko-kr/windows/win32/api/winsock2/nf-winsock2-gethostname

 

gethostname 함수(winsock2.h) - Win32 apps

gethostname 함수(winsock2.h)는 로컬 컴퓨터의 표준 호스트 이름을 검색합니다.

learn.microsoft.com


다음은 간단하게 gethostname 과 gethostbyname 으로 로컬아이피를 구하는 예제 이다.

 

uses 
  winsock2; //winsock 이나 winsosck2둘중 하나쓰면된다. winsock2 쓰자 버전2임
  
function GetLocalIP: string;
//gethostname
var
  WSData: TWSAData;
  aHostName: array[0..255] of Char;
  nBuffLen: integer;
  nResult: integer;
  nI: integer;
  
  apHE: PHostEnt;
  apInAddr4: PInAddr;
begin

  nResult:= WSAStartup($0202, WSData );  //소켓초기화 winsock 이면 $0101 winsock2 면 $0202
  if nResult <> 0 then
  begin
    Result:= '-1'; 
    exit;
  end;

  try
    nBuffLen:= SizeOf( aHostName );     //버퍼길이  
    FillChar( aHostName, nBuffLen, #0); //버퍼인 aHostName 초기화 #0으로 배열값을 채운다.
    
    nResult:= gethostname( aHostName, nBuffLen ); //로컬컴퓨터의 이름을 구한다. 
    if nResult <> 0 then
    begin
      Log('gethostname result : '+IntToStr(nResult));
      exit;
    end;
    //cHostName:= StrPas( aHostName );
    //cHostName:= String( aHostName );
	
    apHE:= gethostbyname( aHostName ); //호스트명으로 정보조회. naver.com 같은 이름을 넣어줘서 nslookup.exe 와 같이 아이피를 얻을수 있다.
	if apHE = nil then
    begin
    	Result:= '-1';
        exit;
    end;
    
    apInAddr4:= PInAddr( apHE^.h_addr_list[0] ); //첫번째 아이피 PInAddr 로 캐스팅
    Result:= inet_ntoa( apInAddr4^ ); //inet_ntoa 로 32비트 정수값을 10진수 표현방식( dotted decimal natation )으로 변환
    
    //아이피는 하나 이상일수 있으며 순서가 반드시 보장되진 않...을껄??
    while apInAddr4 <> nil do
    begin
      Log( IntToStr(nI)+' : '+IntToStr(apInAddr4^.S_addr)+' : ' + StrPas(inet_ntoa( apInAddr4^ )));
      Inc(nI);
      apInAddr4:= PInAddr( apHE^.h_addr_list[ nI ] );
    end;
    {* 출력예
      0 : 1811982528 : 192.168.0.108
      1 : 1711319232 : 192.168.0.102
      2 : 18458816 : 192.168.25.1
      3 : 32024768 : 192.168.232.1
    *}    
  finally
    WSACleanup;
  end;

 

라자루스 에서 테스트 했지만 델파이( 대부분의 버전에서)도 별다른 수정없이 제대로 동작 할것 같다.

그리고 만약 DBMS 를 이용하는 방법도 있는데 내부망 , 외부망으로 접속했을때 다르긴 하겟지만 각 DBMS에서 제공하는 접속 커넥션 에 대한 정보를 구하는 함수들이 있는데 이를 이용하면 접속 커넥션의 ip를 구할수가 있다. 이를 이용해보는것도 또 하나의 방법이다.

 

 

반응형