// NetLookup.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData = { 0 };
/*
struct hostent
{
char * h_name; 主机名
char ** h_aliases; 主机别名,相当于一个String数组
short h_addrtype; 地址类型
short h_length; 地址长度
char ** h_addr_list; 主机地址
};
*/
hostent *host_info;
/*
in_addr 保存32位的IPV4地址结构体
*/
in_addr ip;
//查询键值
char *input_info = "www.nwpu.edu.cn";
//游标指针
char **list;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cout << "WinSock Load failed" << std::endl;
return -1;
}
//根据主机名获取主机信息,在Xp环境下
if (isdigit(input_info[0]))
{
ip.s_addr = inet_addr(input_info);
if (ip.s_addr == INADDR_NONE)
{
printf("%d is not a invalid IP address\n", input_info);
return -1;
}
host_info = gethostbyaddr((char*)&ip, sizeof(ip), AF_INET);
}
else
host_info = gethostbyname(input_info);
if (host_info == NULL)
{
std::cout << "Look Up failed, Error code: " + WSAGetLastError() << std::endl;
return -1;
}
std::cout << "Host Name: " << host_info->h_name << std::endl;
if (host_info->h_aliases)
std::cout << "alias:\n";
//查询主机别名
for (list = host_info->h_aliases; *list != NULL; list++)
printf("\t%s\n", *list);
//分辨主机地址类型
switch (host_info->h_addrtype)
{
case AF_INET:
printf("Address Type: AF_INET\n");
break;
case AF_INET6:
printf("Address Type: AF_INET6\n");
break;
default:
printf("Address Unknown!\n");
break;
}
printf("Address:\n");
//输出主机Ip地址
//inet_addr():把IP地址从点分十进制转换为无符号长整型
//inet_ntoa():把in_addr(sin.addr)结构体转化为IP点分十进制输出
for (list = host_info->h_addr_list; *list != NULL; list++)
{
memcpy(&ip.s_addr, *list, host_info->h_length);
printf("\t%s\n", inet_ntoa(ip));
}
return 0;
}
Network:socket查询主机信息
最新推荐文章于 2022-03-30 22:41:58 发布