将某一主机域名解析为IP地址。
使用 WinSock 单元;
过程如下:
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; 

解决方案 »

  1.   

    function LocalIP:string;
    type
        TaPInAddr = array [0..10] of PInAddr;
        PaPInAddr = ^TaPInAddr;
    var
        phe  : PHostEnt;
        pptr : PaPInAddr;
        Buffer : array [0..63] of char;
        I    : Integer;
        GInitData      : TWSADATA;begin
        WSAStartup($101, GInitData);
        Result := '';
        GetHostName(Buffer, SizeOf(Buffer));
        phe :=GetHostByName(buffer);
        if phe = nil then Exit;
        pptr := PaPInAddr(Phe^.h_addr_list);
        I := 0;
        while pptr^[I] <> nil do begin
          result:=StrPas(inet_ntoa(pptr^[I]^));
          Inc(I);
        end;
        WSACleanup;
    end;
    ========================================
    program get_ip;
    uses
      winsock,sysutils;
    VAR
      ch : ARRAY[1..32] OF Char;
      i : Integer;
      WSData: TWSAData;
      MyHost: PHostEnt;
    begin
      IF WSAstartup(2,wsdata)<>0 THEN
        BEGIN
          Writeln('can''t start Winsock: Error ',WSAGetLastError);
          Halt(2);
        END;
      try
        IF getHostName(@ch[1],32)<>0 THEN
          BEGIN
            Writeln('getHostName failed');
            Halt(3);
          END;
      except
        Writeln('getHostName failed');
        halt(3);
      end;
      MyHost:=GetHostByName(@ch[1]);
      IF MyHost=NIL THEN
        BEGIN
          Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error
    '+IntToStr(WSAGetLastError));
          Halt(4);
        END
      ELSE
        BEGIN
            Write('address ');
             FOR i:=1 TO 4 DO
                BEGIN
                  Write(Ord(MyHost.h_addr^[i-1]));
                  IF i<4 THEN
    then     write('.')
                  ELSE
                    writeln;
                END;
       END;
    end.
    ===========================================
      

  2.   


    //////////////////////////////////////////////
    取得本机ip和机器名
    //////////////////////////////////////////////uses winsock; function LocalIP: String; 
    type 
      TaPInAddr = Array[0..10] of PInAddr; 
      PaPInAddr = ^TaPInAddr; 
    var 
      phe: PHostEnt; 
      pptr: PaPInAddr; 
      Buffer: Array[0..63] of Char; 
      I: Integer; 
      GInitData: TWSAData; 
    begin 
      WSAStartup($101, GInitData); 
      Result := ''; 
      GetHostName(Buffer, SizeOf(Buffer)); 
      phe := GetHostByName(buffer); 
      if phe = nil then Exit; 
      pPtr := PaPInAddr(phe^.h_addr_list); 
      I := 0; 
      while pPtr^[I] <> nil do 
      begin 
        Result := inet_ntoa(pptr^[I]^); 
        Inc(I); 
      end; 
      WSACleanup; 
    end; function IPAddrToName(IPAddr : String): String; 
    var 
      SockAddrIn: TSockAddrIn; 
      HostEnt: PHostEnt; 
      WSAData: TWSAData; 
    begin 
      WSAStartup($101, WSAData); 
      SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr)); 
      HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); 
      if HostEnt<>nil then 
      begin 
        result:=StrPas(Hostent^.h_name) 
      end 
      else 
      begin 
        result:=''; 
      end; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      ShowMessage(IPAddrToName(LocalIp)); 
    end;