从DNS获取IP地址而不使用GetHostByName

Ben*_*iss 12 sockets delphi winapi winsock

GetHostByName用来从主机/ DNS获取IP地址.我也有卡巴斯基互联网安全2013,并注意到它GetHostByName被它挑选.似乎我的进程试图在其中创建一个子键hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS.这实际上意味着,如果用户没有任何管理员权限,我就不能使用此功能.有没有其他方法来解决主机/ DNS?

编辑:这里有一个截图:

在此输入图像描述

编辑2:我实际上使用了getaddrinfo,KIS没有"检测到任何东西".我想使用它,但我仍然希望得到Win2K的支持.

EDIT3:添加了Debug ScreenShot

在此输入图像描述

编辑4:这是我的"测试"代码:

program Project2;

{$APPTYPE CONSOLE}

uses
  Winsock;

var
    DummyWSA : WSADATA;

begin
  if WSAStartup($0202, DummyWSA) = 0 then begin
    GetHostByName ('localhost');
  end;
  readln;
end.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

这个版本似乎根本没有给注册表写任何东西......

Rem*_*eau 15

gethostbyname()是通过DNS查询主机名的正确方法(这getaddrinfo()是一个更好的选择,特别是如果您需要支持IPv6),它绝对不仅限于管理员.许多应用程序使用gethostbyname()(和/或getaddrinfo())因此卡巴斯基不太可能阻止它.

为什么你认为这gethostbyname()是创建一个注册表项?究竟是在创造什么?它不应该创造任何东西.这可能表明一些外部代码已经陷入困境gethostbyname().

  • 我可以确认使用带有简单`gethostbyname`项目的RegMonitor DOES infact会在`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters`(WinXP/D5)上触发`CreateKey`请求 (3认同)
  • @kobik:我在MSDN上找到[一篇文章](http://support.microsoft.com/kb/196500),建议`gethostbyname()`访问`Tcpip\Parameters`来确定IP的顺序回.在"正常"条件下,如果无法访问注册表项,`gethostbyname()`将继续运行.KIS被挂在了注册表中并且正在阻碍它.所以这真的是一个KIS问题,而不是WinSock问题. (3认同)
  • @kobik:我会向KIS提交一份错误报告.`gethostbyname()`在创建时请求对该注册表项的只读访问权限.我没有看到为什么KIS应该将其标记为可疑的原因.另一方面,这可能也是一个微软的错误,因为`gethostbyname()`(或它调用的任何低级别)使用`RegCreateKeyEx()`而不是`RegOpenKeyEx()`. (3认同)
  • 1)我用你的代码(`gethostbyname`)创建了一个Delphi项目示例.2)运行[`RegMon`](http://www.softpedia.com/get/Programming/Other-Programming-Files/Regmon.shtml)3)运行示例项目.并且`RegMon`告诉我该进程确实触发了`CreateKey`请求. (2认同)