2.3.5 需要详细信息的处理
如果需要详细信息,则有如下代码
for (x = 0; poop->iaddrs[x].s_addr && (x < 8); x++)
{
hostent = gethostbyaddr((char*)&poop->iaddrs[x], sizeof(IA), AF_INET);
if ((!hostent) || (!hostent->h_name))
{
char my_h_errno[10] = { 0 };
_itoa(h_errno, my_h_errno, 10);
holler("Warning:inverse host lookup failed for %s:h_eerno %s ", poop->addrs[x], my_h_errno);
}
else
{
comparehosts(poop, hostent);
}
}
其中,通过for循环遍历获取到的主机IP地址列表poop->iaddrs,接下来通过gethostbyaddr()函数获取主机信息,gethostbyaddr()函数的使用方法详见《Winsock网络编程获取主机信息》。如果gethostbyaddr()函数执行失败,则通过自定义函数holler()显示错误信息,如果gethostbyaddr()函数执行成功,则调用自定义函数comparehosts()来比较两次获取到的主机名是否相同,如果不相同,则显示错误信息。
2.3.6 comparehosts()函数
在“2.3.5 需要详细信息的处理”中提到,comparehosts()函数的作用是来比较两次获取到的主机名是否相同。该函数的代码为
int comparehosts(HINF* poop, hostent* hp)
{
errno = 0;
#ifndef WIN32
h_errno = 0;
#endif
#ifdef ANAL
if (strcmp(poop->name, hp->h_name) != 0)
{
#else
if (strcasecmp(poop->name, hp->h_name) != 0)
{
#endif
holler("DNS fwd/rev mismatch: %s != %s", poop->name, hp->h_name);
return (1);
}
return (0);
}
其中,ANAL表示比较主机名时是否区分大小写。如果区分大小写,则使用#define来定义ANAL,如果不需要区分大小写,则不定义ANAL。strcasecmp的定义为
#define strcasecmp _strcmpi
如果两个主机名不相同,则打印错误信息,如果相同,则直接返回。
2.4当参数是IP地址时的处理
当“2.2 IP地址格式转换”中提到的inet_addr()函数成功的实现了IP地址格式的转换,则说明gethostpoop()函数的name参数是格式正确的IP地址。
2.4.1 处理IP地址信息
memcpy(poop->iaddrs, &iaddr, sizeof(IA));
strncpy(poop->addrs[0], inet_ntoa(iaddr), sizeof(poop->addrs));
if (numeric)
{
return (poop);
}
此时,通过memcpy()函数将转换成数字格式后的IP地址保存到poop->iaddrs中,IA实际上就是in_addr结构,其定义为
#define IA struct in_addr
inet_ntoa()将数字格式的IP地址转换为XXX.XXX.XXX.XXX格式,最后通过strncpy()函数将其拷贝到poop->addrs数组中的相应元素中。如果numeric的值是非0,则说明只需要poop结构中的数字信息,此时直接返回poop即可。
2.4.2 无需详细信息的处理
与“2.3.4 无需详细信息的处理”相同。
2.4.3 需要详细信息的处理
与“2.3.5 需要详细信息的处理”相同。