Подтвердить что ты не робот

Получить IP-адрес из DNS без GetHostByName

Я использую GetHostByName, чтобы получить IP-адрес от хоста /DNS. У меня также есть Kaspersky Internet Security 2013 и заметил, что GetHostByName получает его. Похоже, что мой процесс пытается создать подраздел в hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS. Это на самом деле означает, что я НЕ МОГУ использовать эту функцию, если у пользователя нет прав администратора. Есть ли другой способ решения host/dns?

РЕДАКТОР: вот скриншот:

enter image description here

EDIT2: Я фактически использовал getaddrinfo, и KIS не "ничего обнаружил". Я бы хотел использовать его, но мне все равно понравилась бы поддержка Win2K.

EDIT3: добавлен экран отладки

enter image description here

EDIT4: этот мой "тестовый" код:

program Project2;

{$APPTYPE CONSOLE}

uses
  Winsock;

var
    DummyWSA : WSADATA;

begin
  if WSAStartup($0202, DummyWSA) = 0 then begin
    GetHostByName ('localhost');
  end;
  readln;
end.

EDIT5: версия GetAddrInfo...

program Project2;

{$APPTYPE CONSOLE}

uses
  Winsock;

type
  PAddrInfo = ^TAddrInfo;
  TAddrInfo = packed record
    ai_flags: Integer;
    ai_family: Integer;
    ai_socktype: Integer;
    ai_protocol: Integer;
    ai_addrlen: LongWord;
    ai_canonname: Array of Char;
    ai_addr: PSOCKADDR;
    ai_next: PAddrInfo;
  end;

function getaddrinfo(const nodename: PChar; const servname : PChar; const hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall; external 'ws2_32.dll' name 'getaddrinfo';
procedure freeaddrinfo(ai: PAddrInfo); stdcall; external 'ws2_32.dll' name 'freeaddrinfo';

var
  DummyWSA      : WSADATA;
  SocketHint    : PAddrInfo;
  SocketResult  : PAddrInfo;

begin
  if WSAStartup($0202, DummyWSA) = 0 then begin
    //GetHostByName ('localhost');
    getaddrinfo ('localhost', '80', SocketHint, SocketResult);
    // getaddrinfo ('localhost', NIL, SocketHint, SocketResult); // Not sure if I can NIL the port...
  end;
  readln;
end.

Эта версия, похоже, вообще ничего не записывает в реестр...

4b9b3361

Ответ 1

gethostbyname() - это правильный способ запроса имени хоста через DNS (getaddrinfo() - лучший выбор, особенно если вам нужно поддерживать IPv6), и он определенно НЕ ограничен только администраторами. Многие приложения используют gethostbyname() (и/или getaddrinfo()), поэтому маловероятно, что Kaspersky собирается заблокировать его.

Почему вы думаете, что gethostbyname() создает ключ реестра? Что на самом деле создается? Он ничего не должен создавать. Это может означать, что какой-то внешний код подключен к gethostbyname().