netcat中获取主机信息的方法(3-3)

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 需要详细信息的处理”相同。

发布了314 篇原创文章 · 获赞 206 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/103537535
3-3