好的,我对此感到非常沮丧,并希望在我把电脑扔出窗外之前寻求帮助。我正在搞乱套接字,我写了一段代码来从我提供的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)
答案 0 :(得分:0)
gethostbyname()可能会返回给定主机名的多个地址。您循环遍历整个列表,但只返回列表中的最后一个IP。这是错误的做法。您需要遍历列表,尝试一次连接到每个IP,直到一个成功或列表用尽。