-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 のみを返します。それは間違ったことです。成功するか、リストが使い果たされるまで、一度に 1 つずつ各 IP への接続を試みながら、リストをループする必要があります。

于 2013-09-10T15:23:44.920 に答える