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

2.3 当参数name是主机名时的处理

当net_addr()函数返回INADDR_NONE,则需要考虑参数name是主机名。即

if (iaddr.s_addr == INADDR_NONE)//name是计算机名

{

if (numeric)

{

bail("Can't parse %s as an IP address", name);

}

.......

}

2.3.1 numeric值的判断

在“2.1 函数定义”中提到,gethostpoop()函数的参数numeric的值是与参数name对应的,当numeric的值是0时,则name的值必须是主机名;当numeric的值是非0时,则name的值必须是IP地址。所以,当参数name是主机名时,必须要判断numeric的值是否是0,如果不是0,则弹出错误信息。

2.3.2 根据主机名获取主机信息

 

hostent = gethostbyname(name);

if (!hostent)

{

char my_h_errno[10] = { 0 };

_itoa(h_errno, my_h_errno, 10);

bail("%s: forward host lookup failed: h_errno %s ", name, my_h_errno);

}

else 

{

   .......

}

其中,gethostbyname()函数的作用是通过主机名获取主机信息。该函数的参数为主机名,返回值是hostent结构的指针。gethostbyname()函数及hostent结构的详细说明请参考《Winsock网络编程获取主机信息》。如果成功获取了主机信息,则gethostbyname()函数返回获取到的主机信息,如果获取失败,则返回空指针。从以上代码可以,如果获取主机信息失败,则通过自定义的bail()打印出错信息,并退出程序。

2.3.3 处理主机信息

如果成功获取了主机信息,则在“2.3.2 根据主机名获取主机信息”提到的else语句中,对获取到主机信息进行处理。

strncpy(poop->name, hostent->h_name, sizeof(poop->name));

for (x = 0; hostent->h_addr_list[x] && (x < 8); x++)

{

memcpy(&poop->iaddrs[x], hostent->h_addr_list[x], sizeof(IA));

strncpy(poop->addrs[x], inet_ntoa(poop->iaddrs[x]), sizeof(poop->addrs[0]));

}

其中,hostent->h_name是获取到的主机名,将其拷贝到poop->name中。之后,通过for循环遍历获取到的主机IP地址列表,其中x<8保证了只处理IP列表中的前8个IP地址。将IP地址拷贝到poop->iaddrs数组的相应元素中;inet_ntoa()函数将数字格式的IP地址转换为XXX.XXX.XXX.XXX格式,最后通过strncpy()函数将其拷贝到poop->addrs数组中的相应元素中。

2.3.4 无需详细信息的处理

netcat的-v参数表示是否详细输出信息,当加入该参数时,netcat源代码中的o_verbose值为非0,如果不加该参数时,o_verbose的值是0。所以,在“2.3.3 处理主机信息”中获取了主机信息之后,有如下代码

if (!o_verbose)

{

return (poop);

}

如果o_verbose的值是0,则说明netcat没有加入-v函数,此时无需显示详细信息,则程序直接返回poop即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值