delphi从dns查找中获取ip后没有指定地址

时间:2013-09-10 07:12:58

标签: delphi sockets tcp

好的,我对此感到非常沮丧,并希望在我把电脑扔出窗外之前寻求帮助。我正在搞乱套接字,我写了一段代码来从我提供的DNS获取ip。如果我执行命令showmessage(getipfromdns('test.no-ip.org'));

它会显示IP地址没问题。

但是,如果我尝试client1.Host/address(我已尝试过两者) client1.Host:= getipfromdns('test.no-ip.org');

并向我抛出错误,指出没有指定地址。

这是从dns获取ip的功能

function getipfromdns(HostName: string): string;
type
  tAddr = array [0..100] of PInAddr;
  pAddr = ^tAddr;

var
  I: Integer;
  WSA: TWSAData;
  PHE: PHostEnt;
  P: pAddr;
begin
  Result := HostName;
  WSAStartup($101, WSA);
  try
    PHE := GetHostByName(pChar(HostName));
    if (PHE <> nil) then
    begin
      P := pAddr(PHE^.h_addr_list);
      I := 0;
      while (P^[i] <> nil) do
      begin
        Result := (inet_nToa(P^[i]^));
        Inc(I);
      end;
    end;
  except
  end;
  WSACleanup;
end;

以下是创建表单时的代码。

procedure TForm1.FormCreate(Sender: TObject);
var
  duchost : string;
begin
  duchost := getipfromdns('test.no-ip.org');
  Client1.Address := duchost;
  Client1.Active := True;
end;

(client1的类型为TCPServerSocket)

1 个答案:

答案 0 :(得分:0)

gethostbyname()可能会返回给定主机名的多个地址。您循环遍历整个列表,但只返回列表中的最后一个IP。这是错误的做法。您需要遍历列表,尝试一次连接到每个IP,直到一个成功或列表用尽。