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

在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。

 

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

猜你喜欢

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