Q&A

  • 더운날씨 허접이가 ip관련 질문하나 올려봅니다 ㅠㅠ;;
더운날씨 모두 건강 잘 챙기시구요 ^^

제가 이곳 싸이트에서 자신의 ip가져오는 소스를 이것저것 구해서 사용하고있는데요
문제가 발생했습니다 ㅠㅠ;;

무엇인고하니..
실제로 쓰고있는 렌은 유선입니다
그런데 이것이... 무선을 사용을 안하더라도 무선쪽에 ip,subnet mask만 셋팅이 되어있어도
무선 아이피를 가져오내요 ㅠㅠ;;

자기가 실제로 사용하고있는 아이피를 가죠올수는 없나요?
제가 질문이좀.. 그런가요? ㅠㅠ

여러 고수님 답변 꼭 부탁드립니다
아직 식사안하신 분들은 식사 맛나게하시구요 ^^

더위조심하셔요~

ps:지금 사용하고있는 소스입니다..

function GetLocalAddress:string;
var
  wsaData : TWSAData;
  slocal : array[0..255] of AnsiChar;
  phos : PHostEnt;
  addr : PChar;
begin
  Result := '';
  if (WSAStartup(MAKEWORD(1, 1), wsaData) <> 0) then exit;
  if (gethostname(slocal, sizeof(slocal)) = SOCKET_ERROR) then
  exit;
  phos := gethostbyname(slocal);
  if phos = nil then exit;
  addr := PChar(phos.h_addr_list^);
  Result := inet_ntoa(PInAddr(addr)^);
  WSACleanup();
end;

function ip: String;
var
  WSAData: TWSAData;
  HostName, Address: String;
  HostEnt: PHostEnt;
begin
  { no error checking...}
  WSAStartup(2, WSAData);
  SetLength(HostName, 255);
  gethostname(PansiChar(HostName), 255);
  SetLength(HostName, StrLen(PChar(HostName)));
  HostEnt := gethostbyname(PansiChar(HostName));
  with HostEnt^ do
    Address := Format('%d.%d.%d.%d',[Byte(h_addr^[0]),
Byte(h_addr^[1]),
      Byte(h_addr^[2]), Byte(h_addr^[3])]);
  WSACleanup;
  Result := address;
end;
4  COMMENTS
  • Profile
    박무개 2009.07.03 02:17
    요거 한번 써보세요.
    procedure TForm1.Button1Click(Sender: TObject);
    vAR
    LiP : string;
    begin
    HostToIP('컴퓨터 이름', Lip);
    Button1.Caption := LiP;
    end;

    function HostToIP(Name: string; var Ip: string): Boolean;
    var wsdata : TWSAData;
    hostName : array [0..255] of char;
    hostEnt : PHostEnt;
    addr : PChar;
    begin
    WSAStartup ($0101, wsdata);
    try
    gethostname (hostName, sizeof (hostName));
    StrPCopy(hostName, Name);
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
    if Assigned (hostEnt^.h_addr_list) then
    begin
    addr := hostEnt^.h_addr_list^;
    if Assigned (addr) then
    begin
    IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
    byte (addr [1]), byte (addr [2]), byte (addr [3])]);
    Result := True;
    end
    else
    Result := False;
    end
    else
    Result := False
    else
    begin
    Result := False;
    end;
    finally
    WSACleanup;
    end
    end;
  • Profile
    하늘사랑 2009.07.03 03:13
    답변 감사합니다 ^^

    알려주신데로 작성해서 테스트를 해봤는데요 ^^;;;;

    로컬아이피: 111.222.333.444
    무선아이피: 555.666.777.888

    이런상황이라면..

    리턴해서 가져오는아이피가..
    111.333.555.777 요렇게 넘겨주는데용.. ㅠㅠ;;

    제가 무지 허접이라.. 도저히 어디를 손봐서 사용해야할지 모르겠습니다 ^^;;
    아무튼 관심과답변 너무 감사드립니다 ^^

    좋은하루 보내시구요.. 요리조리.. 조물딱~ 해봐야겠어요 ^^
  • Profile
    타마마 2009.07.03 03:57
    원하시는 기능을 구현하시려면 DDK가 필요합니다. (SDK던가..몇년 되서 기억이 가물하군요.)
    장비에 장착되어 있는 장비를 리스트업한 후 로컬장비만 캡쳐해야 합니다.
    하지만 여러개의 로컬네트워크 장비가 사용중이라면 얘기는 더 복잡해 집니다.
    거기에 동적IP를 쓰신다면 실제 아이피를 가져오는 방법은...^^' (이건 외부 도움이 있어야 합니다. 일부 사이트의 도움을 받습니다. 주로..^^)
    전 C로 구현했었던 방법이라..(전직 회사 소스라 공개도 안됩니다..죄송)..

    쉽게 하실 수 있는 방법으로 떠오르는 건 닷넷입니다. 델파이 닷넷에서는 의외로 구현이 쉬울 수 있을걸로 추측됩니다. ( MFC의 닷넷에서는 쉽습니다..>,.< )

    답변이 너무 허접해서 약간 첨부합니다.

    보통

    GetAdaptersInfo 를 통해서 쿼리를 할 장비들의 정보를 얻어 온 후 GetApdatersAddresses 함수를 사용하게 됩니다.

    하지만 위 방법이라 하더라도 공유기를 통해 외부로 나간 경우 실제 자신의 IP를 얻기 위해선 로컬상에서는 알 수 없기 때문에 웹서비스의 힘을 빌립니다. (웹에 접속한 IP를 리턴해주는 사이트들이 있습니다.)
  • Profile
    하늘사랑 2009.07.03 18:21
    타마마님 답변 감사합니다 ^^
    이리저리 해보다.. 이제야 타마마님 답변을보내요..

    암튼.. 이리저리해도 안되서 결국엔 답글주신 마지막글처럼.. 맞는지는 모르겠지만..
    서버에 내 아이피를 묻고 리턴받아 사용하기로했습니다 ㅋ;;;

    두분모두 감사드리구요.. 파빌만하다 델파이할려니.. 컴맹인제가.. ㄷㄷ;;
    어려운게 많내요 ^^

    암튼 너무 감사드립니다 ^^