-1

好的,我对此感到非常沮丧,并想在我将电脑扔出窗外之前寻求您的帮助。我弄乱了套接字,我编写了一段代码来从我提供的 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 类型)

4

1 回答 1

0

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

于 2013-09-10T15:23:44.920 回答