在netcat中,通过gethostpoop()函数获取主机信息。
1初始化套接字
在获取主机信息之前必须初始化套接字。在netcat中,通过res_init()函数实现套接字的初始化。在res_init()函数中,调用WSAStartup()函数初始化套接字。
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return;
以上代码初始化了1.1版本的套接字。接下来再次验证是否初始化的是1.1版本的套接字。
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return;
}
在main()函数中,调用res_init()函数。
2 获取主机信息
2.1 函数定义
gethostpoop()函数的格式为
HINF* gethostpoop(char* name, USHORT numeric);
其中,参数name表示输入的IP地址或者主机名,numeric指定了name的含义,当numeric为0时,name则表示输入的是主机名,numeric为非0时,则表示输入的是主机的IP地址。返回值是自定义结构HINF的指针。
#define MAXHOSTNAMELEN 256
struct host_poop {
char name[MAXHOSTNAMELEN];
char addrs[8][24];
struct in_addr iaddrs[8];
};
#define HINF struct host_poop
自定义结构host_poop中,name表示的是主机名;addrs表示的是XXX.XXX.XXX.XXX格式的IP地址;iddrs则表示的是in_addr结构的IP地址。关于in_addr结构的详细说明,请参考《主机字节序与网络字节序》。8表示获取到的主机IP地址列表中IP地址的个数。
2.2 IP地址格式转换
在gethostpoop()函数中,首先将表示IP地址的参数name转换为in_addr结构。
struct in_addr iaddr;
iaddr.s_addr = inet_addr(name);
其中,net_addr()函数将字符串格式的IP地址转换为二进制格式的IP地址。如果转换成功,net_addr()函数返回转换后的IP地址。如果name中包含的不是XXX.XXX.XXX.XXX格式或者XXX的值大于256,则转换失败,net_addr()函数返回INADDR_NONE。