2011-03-20 44 views
0

如何在没有#include <winsocket2.h>的情况下检索与主机名相关的IP? 我不能使用<winsocket2.h>方法,因为我没有任何编译错误DLL crashs,下面的代码无法正常工作......IP查找主机名无#include <winsocket2.h>

hostent *h = gethostbyname(hostName); 
     LogAlways((const char*)inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr)))); 
+1

给我们更多的代码 - 肯定是你做错了,但你怪怪winsocket – fazo 2011-03-20 03:19:14

+0

'hostName'的*值*是什么?验证这是你认为它应该使用调试器。在那行之后,检查'h'中存储了什么 - 如果发生错误(例如主机查找失败),它可能是空指针。这将很好地保证你的下一条线会以某种方式失败。你需要优雅地处理失败,而不是假定失败。 – Cascabel 2011-03-20 04:03:24

+0

我正在使用visual studio 2008快速版,是啊,它不是我自己的DLL .. hostName的类型是const char *,函数LogAlways允许它 – 2011-03-20 03:25:41

回答

1

如果没有一个包括(或外部库的依赖性)有几乎是没办法。

为了获得映射到IP的主机名,您需要做一个RARP请求,这几乎要求您能够使用套接字。所以无论如何,你需要能够创建一个套接字。这是winsock2.lib提供的库。

所以,你最好让winsock2.lib工作。当你说你的DLL崩溃时没有任何编译错误,我假设你正在谈论你自己的代码,你正试图编译成一个DLL。

如何调试?你有没有尝试通过代码来看看它失败的地方?什么是hostname的类型?检查以确保您不试图访问空指针上的成员。而且在使用变量之前你已经正确地分配了内存。否则,让我们更具体地了解您在调试器中得到的错误消息。

+0

您可以使用'LoadLibrary'调用'ws2_32.dll'中的函数, GetProcAddress'。 '#include'没有必要。 'winsock2.lib'没有必要。并且该程序有机会从旧版Windows上的缺失功能中恢复。 – 2011-03-20 04:16:58

+0

是的,本的权利..我的意思是说,如果不依赖外部图书馆,你不能真正离开。无论是winsock2还是别的什么.. – 2011-03-20 04:49:08