function GetDomainName(Ip:string):string; //由IP得到计算机名
function GetDomainName(Ip:string):string;
var pH:PHostent;
    data:twsadata;
    ii:dword;
begin
  WSAStartup($101, Data);
  ii:=inet_addr(pchar(ip));
  pH:=gethostbyaddr(@ii,sizeof(ii),PF_INET);
  if (ph<>nil) then Result:=pH.h_name
  else Result:='';
  WSACleanup();
end;
肯定能用的哦^_*不过可能只对同一工作组的有效~~对于第一个问题,你先判断是否是IP地址,再由IP地址得到机器名不就得了?

解决方案 »

  1.   

    cornermoss(角落的青苔:射手无弓?你混得太糗了吧~)的回答正确,我已经测试过了,不同工作组我还没测试,对于第一个问题,我就是不知道怎么判断它是不是IP。我想要的:  if Edit.text 是 IP地址 then    hostname:=GetDomainName(Edit.text)
      else
        hostname:=Edit.text;
      

  2.   

    cornermoss(角落的青苔:射手无弓?你混得太糗了吧~)不同工作组确实不行!有没有人解决这一"bug"
      

  3.   

    function Fetch(var AInput: string; const ADelim: string = ' '; const ADelete: { do not localize }
      Boolean = true)
      : string;
    var
      iPos: Integer;
    begin
      if ADelim = #0 then
      begin
        iPos := Pos(ADelim, AInput);
      end
      else
      begin
        iPos := Pos(ADelim, AInput);
      end;
      if iPos = 0 then
      begin
        Result := AInput;
        if ADelete then
        begin
          AInput := ''; { do not localize }
        end;
      end
      else
      begin
        result := Copy(AInput, 1, iPos - 1);
        if ADelete then
        begin
          Delete(AInput, 1, iPos + Length(ADelim) - 1);
        end;
      end;
    end;
    function IsIP(AIP: string): boolean;
    var
      s1, s2, s3, s4: string;  function ByteIsOk(const AByte: string): boolean;
      begin
        result := (StrToIntDef(AByte, -1) > -1) and (StrToIntDef(AByte, 256) < 256);
      end;begin
      s1 := Fetch(AIP, '.');
      s2 := Fetch(AIP, '.');
      s3 := Fetch(AIP, '.');
      s4 := AIP;
      result := ByteIsOk(s1) and ByteIsOk(s2) and ByteIsOk(s3) and ByteIsOk(s4);
    end;
      

  4.   

    你可以用 windows下的IPedit啊!  在组件下面的包中有一个 微软的什么 我记不得了  你可以自己去看看
      

  5.   

    如果是要判断输入的是不是IP
    可以用
    INET_ADDR(pchar(Edit1.text))试一试
    把debugger option里面的default沟掉
    然后你就可以输出你的错误提示了
    通过IP过的计算机名
    uses winsock;
    var
      WSAData:TWSAData;
      p:PHostEnt;
      sIP:string;
      InetAddr:dword;
    begin
      WSAStartup(2,WSAData);
      sIP:=Edit1.Text;
      InetAddr:=Inet_Addr(pchar(sIP));
      try
       try
         p:=GetHostByAddr(@InetAddr,Length(sIP),PF_Inet);
         memo1.Lines.Add('IP:'+sIP);
         memo1.Lines.Add('Host:'+p^.h_name);
       finally
         WSACleanup;
       end;
      except
       memo1.Lines.Add('无法得到');
      end;
    end;
      

  6.   

    我只有vb的代码,不过是使用winsock api 做的dns<>ip 转换工作;至于判断ip是否正确,很简单的
      

  7.   

    to  naughtyboy(淘气男孩) InetAddr:=Inet_Addr(pchar(sIP));我发现如果sIP不为有效IP地址时InetAddr的值为固定值4294967295,若为有效IP地址则InetAddr的值会变化,不知道这个值是什么意思,另外能不能根据这个值来判断是否为IP?你的代码只适合同工作组的情况,不同工作组如何?
      

  8.   

    function GetIPFromName(Name: string): string;
    var
      WSAData: TWSAData;
      HostEnt: PHostEnt;
    begin
      WSAStartup(2, WSAData);
      HostEnt := gethostbyname(PChar(Name));
      with HostEnt^ do
        Result := Format('%d.%d.%d.%d', [Byte(h_addr^[0]),
          Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
      WSACleanup;
    end;
      

  9.   

    function GetNetWorkgroup : string;
    var
      Reg : TRegistry;
    begin
      Reg := TRegistry.create;
      Result := '(n/a)';
      with Reg do
      try
         RootKey := HKEY_LOCAL_MACHINE;
         if OpenKey('System\CurrentControlSet\Services\VxD\VNETSUP', 
            false) then
            Result := ReadString('Workgroup');
      finally
         CloseKey;
         free;
      end;
    end;