gethostbyname win32错误

时间:2009-03-13 02:29:10

标签: c winapi sockets visual-studio-2005

我正在以通常的方式使用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。 / p>

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

是否有人知道此命令会导致此错误发生的任何问题?

提前致谢,

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

是lpServerName:

  • 非NULL终止
  • NULL
  • 已删除

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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