Получить 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.
Эта версия, похоже, вообще ничего не записывает в реестр...
Ответы
Ответ 1
gethostbyname()
- это правильный способ запроса имени хоста через DNS (getaddrinfo()
- лучший выбор, особенно если вам нужно поддерживать IPv6), и он определенно НЕ ограничен только администраторами. Многие приложения используют gethostbyname()
(и/или getaddrinfo()
), поэтому маловероятно, что Kaspersky собирается заблокировать его.
Почему вы думаете, что gethostbyname()
создает ключ реестра? Что на самом деле создается? Он ничего не должен создавать. Это может означать, что какой-то внешний код подключен к gethostbyname()
.