【问题标题】:gethostbyname win32 errorgethostbyname win32错误
【发布时间】:2009-03-13 02:29:10
【问题描述】:

我正在以通常的方式使用 gethostbyname() 函数...

iaHost.s_addr = inet_addr(lpServerName);
if (iaHost.s_addr == INADDR_NONE)
{
    // Wasn't an IP address string, assume it is a name
    lpHostEntry = 0;
    lpHostEntry = gethostbyname(lpServerName);
}

访问我的网站并返回信息。变量“lpServerName”可以是任何主机,例如“google.com”或环回“127.0.0.1”。

我的系统:在 AMD Opteron 系统上运行的 Windows x64 或 x32(发生相同的错误无关紧要),XAMPP 在我的机器上,我将它用于调试目的,我的编译器是 Microsoft Visual c++ 2005。

问题是:当我使用环回地址时,上面的代码可以正常工作。当我尝试访问计算机外部的网站时,出现以下错误:“Windows 已在 test_gethostbyname.exe 中触发断点。这可能是由于堆损坏,并表明 test_gethostbyname.exe 或任何它已加载的 DLL。输出窗口可能有更多的诊断信息“。该程序“test_gethostbyname.exe”仅包含来自一个更大的项目的代码部分,该项目适用于访问 Internet。因此,我认为堆没有被我所做的任何事情破坏。我已经尝试了具有相同结果的“getaddrinfo”命令。我在网上搜索了有关此问题的任何类型的信息(除了 unix 系统上的分段错误)。

有谁知道这个命令有什么问题会导致这个错误发生吗?

提前致谢,

杰

【问题讨论】:

  • IP和域名都试过了吗?

标签: c winapi sockets visual-studio-2005


【解决方案1】:

我看到您正在检查 INADDR_NONE,但是另一个失败状态 INADDR_ANY 呢

http://msdn.microsoft.com/en-us/library/ms738563(VS.85).aspx

你传递给 gethostbyname() 的字符串是什么?很可能是 lpServerName 的格式有问题。

【讨论】:

    【解决方案2】:

    我找到了答案。问题似乎是我的 XP 系统上的库。正如我之前提到的,我在另一个 XP 系统上编译程序没有问题。我在我的开发系统上使用 Windows 7 和 Visual c++ 8 express 编译了该系统,它可以工作。

    【讨论】:

      【解决方案3】:

      是 lpServerName:

      • 非 NULL 终止
      • 空
      • 已删除

      我的猜测是它不是 NULL 终止的。

      也许 inet_addr 会停止,即使它没有看到 NULL 终止,所以这就是为什么当您使用普通 IP 点分字符串时它可以工作的原因。

      【讨论】:

        【解决方案4】:

        我玩过字符串是否为空终止并且错误没有消失。我编译的示例来自 Microsoft 对 gethostname() 的描述,我认为它在功能上是正确的,但我仍然得到错误。

        今天早上,我在另一台使用快速版本的 Visual c++ 的机器上重新编译了示例,并且没有发生错误。因此,我开始怀疑我的开发机器上的库库可能有问题,所以我将重新安装编译器和平台 SDK,看看是否能解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 1970-01-01
          相关资源
          最近更新 更多