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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值